CSharp 多线程通信

方法:使用C#提供的Action<>和Fun<>泛型委托来处理

需求:开启两个子线程,一个线程负责UDP接收网络数据,另一个线程负责数据的UI界面显示

需求涉及3个线程:

  • UI主线程
  • 界面更新线程
  • UDP接收线程
namespace 线程通知演示
{
    public partial class Form1 : Form
    {
        private UdpClient mUdpRecvClient;

        public Form1()
        {
            InitializeComponent();

            TextBox.CheckForIllegalCrossThreadCalls = false;

            //UI显示线程
            Thread showThread = new Thread(show);
            showThread.Start();
        }

        private void show()
        {
            //泛型委托
            Action<string> callback = update;

            //UDP接收线程
            Thread receiveThread = new Thread(udpReceiver);
            receiveThread.IsBackground = true;
            receiveThread.Start(callback);
        }

        private void udpReceiver(Object obj)
        {
            //获取本地的IP地址
            string localIP = string.Empty;
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
                {
                    localIP = _IPAddress.ToString();
                    break;
                }
            }

            Console.WriteLine(localIP);

            IPEndPoint localIpep = new IPEndPoint(IPAddress.Parse(localIP), 25000); //本机IP和监听端口号

            IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Any, 0);

            mUdpRecvClient = new UdpClient(localIpep);

            while (true)
            {
                try
                {
                    byte[] data = mUdpRecvClient.Receive(ref remoteIpep);
                    string message = Encoding.Default.GetString(data, 0, data.Length);
                    Console.WriteLine(message);

                    Action<string> callback = obj as Action<string>;
                    callback(message);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    break;
                }
            }
        }

        private void update(string message)
        {
            textBox.Text = message;
        }
    }
}
上一篇 CSharp ListView操作
下一篇 CSharp 子线程更新UI
目录
文章列表
1 Android Studio通过ASM Bytecode Outline插件生成ASM插桩代码
Android Studio通过ASM Bytecode Outline插件生成ASM插桩代码
2
MySQL 元数据
MySQL 元数据
3
常用正则表达式汇总
常用正则表达式汇总
4
Swift - 属性观察者(willSet与didSet)
Swift - 属性观察者(willSet与didSet)
5
CentOS下安装Confluence 7.1.0
CentOS下安装Confluence 7.1.0
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。