加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 委托和交叉线程异常

发布时间:2020-12-16 01:35:35 所属栏目:百科 来源:网络整理
导读:每当我使用委托更新 Windows窗体中的UI时,它就会给我跨线程异常 为什么会这样? 是否为每个代表调用启动了新线程? void Port_DataReceived(object sender,SerialDataReceivedEventArgs e){ //this call delegate to display data clsConnect(statusMsg);} p
每当我使用委托更新 Windows窗体中的UI时,它就会给我跨线程异常
为什么会这样?
是否为每个代表调用启动了新线程?

void Port_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
       //this call delegate to display data
       clsConnect(statusMsg);
}




 protected void displayResponse(string resp)
 {
     //here cross thread exception occur if directly set to lblMsgResp.Text="Test";
     if (lblMsgResp.InvokeRequired)
     {
        lblMsgResp.Invoke(new MethodInvoker(delegate { lblMsgResp.Text = resp; }));
     }
 }

解决方法

Port_DataReceived显然是由端口监视组件上的线程引发的异步事件处理程序.

is there new thread started for each
delegate call ?

不,可能不是.您的端口监视组件正在后台线程上运行轮询,并且每次都从该线程引发事件.

关键是它是在UI以外的线程上调用的,因此您需要使用Control.Invoke以及与之关联的模式.

考虑一下,(并阅读post可能会为你阐明的事情)

void Port_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
   //this call delegate to display data
   UpdateTheUI(statusMsg);
}

private void UpdateTheUI(string statusMsg)
{
    if (lblMsgResp.InvokeRequired)
    {
        lblMsgResp.BeginInvoke(new MethodInvoker(UpdateTheUI,statusMsg));
    }
    else
    {
       clsConnect(statusMsg);
    }
}

尽管如此,如果我没有指出间接是令人不安的话,那将是我的疏忽.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读