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 Swift UI - 开关按钮(UISwitch)
Swift UI - 开关按钮(UISwitch)
2
Android快速开发
Android快速开发
3
Shell脚本获取本机IP并将IP赋值给变量待用
Shell脚本获取本机IP并将IP赋值给变量待用
4
CentOS 7下安装RabbitMQ
CentOS 7下安装RabbitMQ
5
玩转Redis - 京东签到领京豆如何实现
玩转Redis - 京东签到领京豆如何实现
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。