美文网首页
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和工作线程的交互

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