如何将UI连接到WPF中的主线程



我有一个程序,它有几个UI,每个UI在同一区域一个接一个地绘制图形。每项更改都是由事件驱动的。现在我必须使用RFID,它必须执行连接和其他一些耗时的操作,以及等待标签的可能性。因此,所有这些事情都必须在线程中完成。

Thread t = new Thread(() => 
{
while (err == errNOTAG)
{
try
{
err = 0;
byArray = bisvController.ReadTypeAndSerial(RfidPort);               
}
catch (Exception ex)
{
err = ex.HResult;
}
}
if (byArray != null)
{
... under some conditions proceed <-----
}   
});
t.Start();

所以如果我继续这样下去,我会得到通常的错误

调用线程必须是STA,因为许多UI组件都需要这个

所以现在我可以用Application.Dispatcher做所有的图形,但我不想这样做,因为我必须更改大量代码。

相反,我想做的是重新加入主线程。我找到的解决方案是在主线程中使用一个计时器,在上面的线程中设置一个条件:

bool ProceedCondition = false;
Thread t = new Thread(() => 
{
while (err == errNOTAG)
{
try
{
err = 0;
byArray = bisvController.ReadTypeAndSerial(RfidPort);               
}
catch (Exception ex)
{
err = ex.HResult;
}
}
if (byArray != null)
{
ProceedCondition = true;
}   
});
t.Start();

然后对ProceedCondition进行时间检查,并且当设置为true时继续到下一个UI。因此,这适用于在主线程中定义的计时器。有人能为重新加入主线程提出另一种解决方案吗?

提前感谢

Patrick

通常你会做这样的事情:

Application.Current.Dispatcher.BeginInvoke(new System.Action(() => {
/* code you want to run on the GUI thread goes here */
}));

如果你需要等待操作完成,那么等待任务,或者如果你已经在一个任务中开始,就等待:

Application.Current.Dispatcher.BeginInvoke(new System.Action(() => {
/* code you want to run on the GUI thread goes here */
})).Wait();

相关内容

  • 没有找到相关文章

最新更新