异步等待最佳实践

我已经掌握了异步等待的概念并且一直在使用它,但确实有一些关于最佳实践的问题。

  1. 是否可以在while(条件)循环中使用await来继续获取可能存在的数据,直到while条件发生变化,例如stopProcessingMessages = false。

  2. 在诸如winforms的应用程序中,当UI在它的线程上运行时,在按钮单击等操作上使用async / await是相当简单的,但是如果我想在整个控制台应用程序甚至窗口中异步执行呢?服务。 什么是最初开始第一次等待任务的最佳做法,那就是Task.Run(()=> …)?

我希望我在第二个问题中有意义。 我想充分利用异步并充分利用它,但只需要了解如何在它向所有其他异步函数冒泡之前启动初始异步操作。

不使用正确的代码块道歉我在火车上使用我的智能手机。

我已经掌握了异步等待的概念并且一直在使用它,但确实有一些关于最佳实践的问题。

我有一个async / await博客文章的介绍,比大多数介绍更详细,并介绍了几个最佳实践。

是否可以在while(条件)循环中使用await来继续获取可能存在的数据,直到while条件发生变化,例如stopProcessingMessages = false。

你想避免紧密循环。 所以while (condition) GetDataIfPresent(); 将消耗大量的CPU。

或者,如果stopProcessingMessagestrue ,则可以使用返回null (或其他)的async方法。 在这种情况下,您的代码将是while (true) ,而更像TAP的解决方案是使用CancellationSource而不是标志。

另请参阅TPL Dataflow ; 听起来它对你的情况可能有用。

控制台应用程序,甚至是Windows服务。 什么是最初启动第一次等待任务的最佳做法

对于控制台应用程序,您可以Wait顶级任务。 这是通常指南的可接受的例外( await而不是Wait )。 Wait将在控制台应用程序的持续时间内刻录线程,但这通常不足以保证更复杂的解决方案。 如果您确实要为控制台应用程序安装单线程上下文,则可以使用AsyncEx库中的 AsyncContext.Run

对于Win32服务,您通常需要启动自己的线程 。 您可以使用Task.Run (如果您需要multithreading上下文)或AsyncEx中的AsyncContextThread (如果您需要单线程上下文)。

早上好,

我宁愿使用常规任务,在第一个场景中将TaskCreationOption设置为’LongRunning’而不是async / await模式。 这样你的整个块就会在一个长时间运行的任务中执行。 在每个while循环中使用await时,你会在每个循环中启动一个新任务 – 会起作用,但它可能不是那么理想;-)

关于你的第二个问题,我很抱歉,但我不明白你的观点。

希望这可以帮助。

使用循环来保存可能存在的数据是不行的。您可以创建一个异步调用,在完成后将自动调用回调方法。在这种情况下,“等待”阶段将发生在OS机制中以最佳方式处理此等待阶段以使用所使用的OS。

看看这里有关该主题的进一步研究: http : //msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx