c#如何通过WinForms中另一个线程的事件更新标签?

时间:2016-06-03 11:11:39

标签: c# multithreading winforms events

我从另一个线程的UDP端口读取数据。我使用Task启动UDP客户端,并在满足特定条件时引发事件。该事件在我的按钮线程中订阅。但是当我尝试更新我的标签时,它会出现一个错误,即“#34; lblHeartbeat"从创建它的线程以外的线程访问。它现在不在正确的线程中吗?

在我的用户界面中,我有:

    private void btnMyButton_Click(object sender, EventArgs e)
    {

            Task.Factory.StartNew(() => SetName(obj1, obj2, obj3));

        myListiner.MessageReceived += (s) => lblHeartRate.Text = s;


    }


    public void SetName(object obj1, object obj2, object obj3)
    {

        myListiner.SpreadValue(obj1, obj2, obj3);

    }

1 个答案:

答案 0 :(得分:0)

如果异常通知你关于跨线程活动的唯一有用的是调用:

同步:Control.Invoke()
异步:Control.BeginInvoke()

如果不确定是否要调用,则应使用Control.InvokeRequired。

您可以递归使用Invoke.Required。这是一个C ++ - 代码:

void FormMain::OnEvent(Object^  sender, EventArgs^  e){
if (this->InvokeRequired)
    this->Invoke(gcnew EventHandler(this, &FormMain::OnEvent), sender, e);
else
{
    // here is your code to run in GUI thread
}

}