我从另一个线程的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);
}
答案 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
}
}