-
在编一个上位机的时候遇到这样一个问题:
上位机要实现控件按钮点击实现下发指令,如果指令发送正确,则在UI的显示控件上显示正确,如果发送失败则显示失败。这里面就涉及到两个线程的交互 -
1、UI线程
-
2、工作线程
工作线程即写串口线程,该线程完成的功能是:将需要发送的指令写到串口,写完后接收设备上的返回,即ACK,如果正确则线程结束,告知UI线程;如果失败,继续尝试写一次,再接收ACK判断,如此循环,如果在设定的尝试次数内均失败,则告知UI线程发送失败。 -
这里就遇到两个问题
1、UI线程执行发送事件后,应该异步调用发送功能,这个比较简单采用建立一个工作者线程在后台运行即可。
//定义了一个更新UI的操作,主要是供工作线程那边,定义委托的对象时使用
public static void OperateUI(string operation)
{
DateTime t = DateTime.Now;
控件.Items.Add("工作线程通过托管异步调用窗口控件" + operation);
}
//UI异步调用写总线函数
delegate void TryWriteDelegate(string order);
public void Status_Click(object sender, EventArgs e)
{
TryWriteDelegate SendOrder = new TryWriteDelegate(Write);
SendOrder.BeginInvoke("下发命令", null, SendOrder);
}
2、工作者线程执行结束后需要更新UI内容,这相当于跨线程调用,通常无法直接进行,常采用回调函数,但在这里需要特别注意.net原则上不允许跨线程调用控件,一般有两种解决方案
Control.CheckForIllegalCrossThreadCalls = false;
delegate void OperateUIDelegate(string information);
void work()
{
....
if (A.控件.InvokeRequired)
{
OperateUIDelegate OUI = new OperateUIDelegate(A.OperateUI);
A.控件.beginInvoke(OUI, new object[] { "尝试1次" });
}
....
}
- 委托(Delegate)的BeginInvoke和EndInvoke方法操作线程
在C#中使用线程的方法很多,使用委托的BeginInvoke和EndInvoke方法就是其中之一。BeginInvoke方法可以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用。
推荐几个写得不错的文章
网友评论