InvokeRequired和Invoke

有些方法比较繁琐简化一下

例如在另开一个Thread的时候需要通过delegate和Invoke来跨线程访问UI控件,相关代码可以简化

跨线程访问控件

        private delegate void ReceiveAppendStringDelegate(string message); //注册一个自定义的delegate

        /// <summary>
        /// 委托处理函数
        /// </summary>
        /// <param name="message">附加的字符串</param>
        private void ReceiveAppendString(string message)
        {
            if (InvokeRequired)
            {
                Invoke(new ReceiveAppendStringDelegate(ReceiveAppendString), new object[] { message });
            }
            else
            {
                RecvCountTextBox.Text = (int.Parse(RecvCountTextBox.Text) + message.Length).ToString();
                ReceiveTextBox.AppendText(message);
            }
        }

        /// <summary>
        /// UDP处理线程
        /// </summary>
        private void UdpReceiveHandler()
        {
            while (UdpIsOpen)
            {
                try
                {
                    Thread.Sleep(10);
                    if (udp.Available <= 0) continue;
                    IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                    byte[] recvBytes = udp.Receive(ref remoteIpEndPoint);
                    string message = System.Text.Encoding.Default.GetString(recvBytes);
                    ReceiveAppendString(message);
                }
                catch (Exception)
                {
                    break;

                }
            }
        }

事件类型

如果是事件类型的委托可以省去最开始定义的delegate,因为事件就是一种特殊的委托 .Net帮咱们处理完了

例如

        private void usb_OnDataRecieved(object sender, UsbLibrary.DataRecievedEventArgs args)
        {
            if (InvokeRequired) //托管调用
            {
                 Invoke(new DataRecievedEventHandler(usb_OnDataRecieved), new object[] { sender, args });    
            }
            else
            {
                DoSomething();
            }
        }

猜你喜欢

转载自blog.csdn.net/Tokeyman/article/details/51440319