使用async/await和Task进行时间关键处理有什么区别?
比方说,我有一种方法,每隔10ms不断接收输入,将数据添加到Queue<T>
,另一个线程出列并执行一些处理,并写入文件以保持一切流畅。原因是因为处理将花费超过10毫秒。使用async/await和Task进行时间关键处理有什么区别?
在使用.Net 4更新此方法时,我将使用长时间运行选项启动一个新任务,以确保创建新线程。有一个BlockingCollection<T>
将数据添加到任务方法中并使用BlockingCollection
调用GetConsumingEnumerable
来处理数据并将其写入文件。
首先,我不完全确定是否需要任务来创建新线程,但由于我的无知,这似乎是最有效的方法。其次引进的async
和await
关键字
我可能再次改写这个,这样当数据到来时,调用标有async
这确实处理,然后调用await FileStream.WriteAsync
的方法。这将确保相隔10ms进入的数据是否可以正常处理,并且没有后台日志?我发现这些新关键字不会创建新线程,而只是以某种方式及时处理执行。
在我的情况下,这对我有什么好处,还是应该坚持使用长时间运行的Task和BlockingCollection创建新线程?
回答:
如果您每隔10ms收到一次输入并且处理时间超过10ms,那么除非您在后端进行并行处理,否则您将无法跟上。
听起来像生产者/消费者的方法是最适合你的情况。您可以将BlockingCollection<T>
用于单独的线程/任务,但您还应该考虑Dataflow library(新VS异步支持的一部分)。数据流库允许您设置一个流水线(或网格),用于定义数据在系统中的流动方式;任务根据需要自动创建。
回答:
异步和等待关键字旨在帮助您编写对花费很长时间来响应的函数/ API的异步调用。编译器会在两个方法中调用,即启动任务的方法和调用完成时的回调方法。
在你的情况下,似乎没有意义使用异步和等待,因为你正在启动一个单独的任务来处理工作。工作完成后没有第三件事需要发生。
以上是 使用async/await和Task进行时间关键处理有什么区别? 的全部内容, 来源链接: utcz.com/qa/259172.html