【发布时间】:2014-03-07 08:42:55
【问题描述】:
我有这个方法WaitForReaderArrival,如下所示:(一直运行等待读者到达)
public void WaitForReaderArrival()
{
do
{
if (ReaderArrived())
{
break;
}
System.Threading.Thread.Sleep(1000);
} while (ReaderArrived() == false);
}
我正在等待读者使用,
await Task.Run(new Action(WaitForReaderArrival));
if (ReaderArrived())
{
//Raise an ReaderArrived here!
..//blah blah
}
我的一位同事要求我将上述行更改为
WaitForReaderArrival();
if (ReaderArrived())
{
//Raise an ReaderArrived here!
..//blah blah
}
问题是:
我上面采用的异步模型真的没用吗?为什么她要我把那条线改成正常的同步方法,这对我来说仍然是个问题。
上面的什么是等待某事发生然后继续的正确方法?
【问题讨论】:
-
很可能应该有某种外部事件,发生在“阅读器到达”时,例如用户输入、套接字消息、传入的串行端口数据等。有类似的吗?
-
没有。我正在编写的库会公开此事件并在遇到上述代码时引发。
-
您使用的代码是busy waiting loop 的略微改进版本,它会轮询带有节流的东西。 如果您没有任何其他方式来获得更改通知,那么使用
await Task.Run将此类循环卸载到池线程可能是您能做的最好的事情。 -
其实你可以用
Task.Delay来改进一下,比如this。 -
@Noseratio:我刚问过,答案是肯定的。似乎有一个 UI 存在并等待在
smart card arrival上得到通知。正如你所指出的,如果我没有使用 await,我的 UI 将被冻结。
标签: c# .net multithreading .net-4.5 async-await