有些方法比较繁琐简化一下
例如在另开一个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();
}
}