【问题标题】:async await best practices异步等待最佳实践
【发布时间】:2013-02-02 12:44:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    也可以看看TPL Dataflow;听起来它可能对您的情况有用。

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

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

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

    【讨论】:

    • 感谢斯蒂芬的简洁回答。我实际上最终选择了 TPL Dataflow 的 BufferBlock。在控制台环境中,我还发现 Task.Run (async () => await .... );启动一个初始的异步进程也足够了。
    • 重新控制台顶级 async 操作:Task.Run 不会比简单地调用 async 方法为您带来任何好处。您仍然需要在返回的任务上Wait 等待它完成后再退出。
    【解决方案2】:

    早上好,

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

    关于你的第二个问题,对不起,我不明白你的意思。

    希望这会有所帮助。

    【讨论】:

    • 确实,一个充满awaits 的循环实际上会开始......有多少新任务?除非stopProcessingMessages 变量被匆忙设置,否则它可能会启动数千个线程。也就是说,在问题上下文中“继续获取”是什么意思?单个任务有一个结果,而不是要持续获取的数据流。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 2010-10-09
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 2018-12-26
      • 2018-11-24
      • 2020-08-26
      • 1970-01-01
      相关资源
      最近更新 更多