5

我已经掌握了异步等待的概念并且偶尔使用它,但是对于最佳实践确实有几个问题。

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

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

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

抱歉,我在火车上使用智能手机时没有使用正确的代码块。

4

3 回答 3

7

我已经掌握了异步等待的概念并且偶尔使用它,但是对于最佳实践确实有几个问题。

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

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

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

或者,您可以使用async返回null(或其他) if stopProcessingMessagesis的方法true。在这种情况下,您的代码将是while (true),并且更类似于 TAP 的解决方案是使用CancellationSource而不是标志。

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

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

对于控制台应用程序,您可以Wait执行顶级任务。这是通常准则的可接受例外(即 toawait而不是Wait)。Waiting 将在控制台应用程序的持续时间内烧毁一个线程,但这通常不足以保证更复杂的解决方案。如果您确实想为您的控制台应用程序安装单线程上下文,您可以AsyncContext.Run从我的AsyncEx 库中使用。

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

于 2013-02-18T12:54:11.470 回答
2

早上好,

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

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

希望这可以帮助。

于 2013-02-18T06:15:15.327 回答
0

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

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

于 2013-02-18T06:20:08.963 回答