异步等待最佳实践

时间:2013-02-18 05:58:45

标签: c# .net asynchronous frameworks async-await

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

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

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

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

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

3 个答案:

答案 0 :(得分:7)

  

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

我有一个intro to async/await blog post比大多数介绍更详细,并介绍了几个最佳实践。

  

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

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

或者,如果asyncnull,您可以使用返回stopProcessingMessages(或其他)的true方法。在这种情况下,您的代码将为while (true),而更类似TAP的解决方案是使用CancellationSource而不是标记。

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

  

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

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

对于Win32服务,通常是do need to start your own thread。您可以使用Task.Run(如果需要多线程上下文),或者使用AsyncEx中的AsyncContextThread(如果需要单线程上下文)。

答案 1 :(得分:2)

早上好,

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

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

希望这有帮助。

答案 2 :(得分:0)

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

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