【发布时间】:2016-07-04 03:45:05
【问题描述】:
我的应用程序中有一个模式,我想发送一些命令或启动一些 IO 工作并等待它完成,或者有一些机制来知道它是否已经完成。
为此,我计划使用async/await 模式。我假设大多数人在编码时都达到了这种模式。
while(something)
DoNothing();
DoNothing() 通常最终会占用一些 CPU 时间或完全停止程序。我认为解决这个问题的正确方法是使用async/await 模式。
就我而言,我想出了以下简单的方法
public override async Task<Boolean> PerformProcessingAsync()
{
StartSomeIOProcessing();
while (TheIOProcessingResult == null)
await Task.Yield();
return true;
}
它开始一些 IO 处理,然后等待结果被实例化。与此同时,尽管它调用Task.Yield 返回到调用上下文,然后可以继续工作,并将此方法的延续(下一个while 循环迭代)放到调用堆栈上。
这是正确的解释吗,这是解决上述情况的正确方法吗?
编辑:在我面临的更具体的情况下......我还维护另一个执行 IO 工作的库,主要是读取和写入 SerialPort 对象。这个库的工作原理是拥有一个ConcurrentQueue 的读取或写入,它针对特定端口处理它。一个Task“位于此队列的末尾”并在执行过程中消耗工作。
大多数阅读工作只是查询一些值,对其进行解析,然后触发一个事件NewData(double myNewData),该事件由 UI 监听。在 UI 中,状态表示保存了 SerialPorts 数据。在状态表示中,NewData 事件被处理,该事件更新它对应的值。
写入以相同的方式完成,但完成时不会触发事件,只是将端口写入。判断它是否成功的唯一方法是等待读取更新状态。 (遗憾的是,由于硬件的行为方式,没有更好的方法可以做到这一点。
我当前的应用程序利用这个库来执行它的 IO 工作。读取会定期发送到库,以使 UI 保持来自端口的新值...当用户单击按钮时,写入会发送到库以从硬件发出命令。
我希望确保写入是以编程方式发生的。我能想到的唯一方法是将写入发送到库,然后等待读取更新写入效果的数据。
因此循环。
【问题讨论】:
-
我已经删除了我所有的旧 cmets,因为它们已合并到我们的聊天中,如果您愿意,您也可以这样做。
标签: c# asynchronous