美文网首页
c#UI和工作线程的交互

c#UI和工作线程的交互

作者: eesly_yuan | 来源:发表于2014-10-12 16:25 被阅读1022次
  • 在编一个上位机的时候遇到这样一个问题:
    上位机要实现控件按钮点击实现下发指令,如果指令发送正确,则在UI的显示控件上显示正确,如果发送失败则显示失败。这里面就涉及到两个线程的交互

  • 1、UI线程

  • 2、工作线程
    工作线程即写串口线程,该线程完成的功能是:将需要发送的指令写到串口,写完后接收设备上的返回,即ACK,如果正确则线程结束,告知UI线程;如果失败,继续尝试写一次,再接收ACK判断,如此循环,如果在设定的尝试次数内均失败,则告知UI线程发送失败。

  • 这里就遇到两个问题
    1、UI线程执行发送事件后,应该异步调用发送功能,这个比较简单采用建立一个工作者线程在后台运行即可。

  • 我这里采用的是c#委托的异步调用,实现方式如下

//定义了一个更新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方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用。

推荐几个写得不错的文章

相关文章

  • c#UI和工作线程的交互

    在编一个上位机的时候遇到这样一个问题:上位机要实现控件按钮点击实现下发指令,如果指令发送正确,则在UI的显示控件上...

  • Java多线程:线程间通信之volatile与sychroniz

    由前文Java内存模型我们熟悉了Java的内存工作模式和线程间的交互规范,本篇从应用层面讲解Java线程间通信。 ...

  • java线程内存模型

    线程、工作内存、主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程有自己的工作内存 r...

  • java内存模型与线程

    硬件:处理器,高速缓存和主内存间的交互关系 线程,主内存,工作内存的关系 线程对变量所有操作(读取,赋值)等必须在...

  • Java自学-多线程 交互

    Java 线程之间的交互 wait和notify 线程之间有交互通知的需求,考虑如下情况:有两个线程,处理同一个英...

  • 多线程系列第(八)篇---Android中的线程

    主线程和子线程 主线程,又叫UI线程,主要作用是运行四大组件以及处理它们和用户的交互。子线程也叫工程线程,主要作用...

  • 一文讲解:Java线程内存模型,线程、工作内存、主内存

    Java线程内存模型 线程、工作内存、主内存三者之间的交互关系图: key edeas 所有线程共享主内存,每个线...

  • Android

    线程间通信 主线程和工作线程主线程和工作线程 工作线程与工作线程工作线程与工作线程 为什么主线程Looper.lo...

  • 线程间通信 Thread+handler

    前言:主线程和子线程的相互交互: 一、子线程向主线程发消息(Thread+handler): 1、主线程中定义Ha...

  • Java 线程间通信

    线程间的交互和通信 一个线程启动另一个线程public static void main(String[] arg...

网友评论

      本文标题:c#UI和工作线程的交互

      本文链接:https://www.haomeiwen.com/subject/nklptttx.html