async等待最佳实践

本文关键字:最佳 等待 async | 更新日期: 2023-09-27 18:00:06

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

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

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

我希望我的第二个问题讲得有道理。我想充分利用异步并充分利用它,但只需要了解如何在最初的异步操作扩展到所有其他异步函数之前启动它。

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

async等待最佳实践

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

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

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

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

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

还可以查看TPL数据流;这听起来可能对你这种情况有用。

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

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

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

早上好,

我宁愿在第一个场景中使用TaskCreationOption设置为"LongRunning"的常规任务,而不是异步/等待模式。这样,您的整个while块将在一个长时间运行的任务中执行。当在each while循环中使用wait时,您将在每个循环中启动一个新任务-会起作用,但可能不是那么优化;-)

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

希望这能有所帮助。

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

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