我有一个程序,它有几个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();