异步等待最佳实践(async await best practices)

2019-08-17 01:26发布

我已经掌握了异步的等待,并偶尔用它已经,但有关于最佳做法的几个问题的概念。

  1. 是它确定使用等待在一段时间(条件)循环,以保持读取可能存在的数据,直到而病情变化,例如stopProcessingMessages =假。

  2. 在应用程序中,如的WinForms,而UI运行在它的线程,使用异步/等待的操作,如点击一个按钮是相当琐碎,但是,如果我想在一整个控制台应用程序,甚至在Windows异步执行什么服务。 什么是先揭开序幕,首先的await任务的最佳做法,那会是Task.Run(()=> ...)?

我希望我在我的第二个问题,决策意识。 我要充分利用异步,并利用它来它的全部范围,而是只需要了解如何把它泡到所有其它异步函数之前揭开序幕,初始异步操作。

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

Answer 1:

我已经掌握了异步的等待,并偶尔用它已经,但有关于最佳做法的几个问题的概念。

我有一个介绍到async / await博客文章是进入比大多数前奏更多的细节和还介绍了几种最佳做法。

是它确定使用等待在一段时间(条件)循环,以保持读取可能存在的数据,直到而病情变化,例如stopProcessingMessages =假。

你要避免紧密循环。 因此, while (condition) GetDataIfPresent(); 是要消耗大量的CPU。

或者,你可以使用一个async该方法返回的null (或其他)是否stopProcessingMessagestrue 。 在这种情况下,你的代码将是while (true) ,更TAP样的解决方案是使用CancellationSource而不是标志。

也看看TPL数据流 ; 这听起来像它可能是你的一种情况是有用的。

控制台应用程序,甚至是Windows服务。 什么是先揭开序幕,首先等待任务的最佳实践

对于控制台应用程序,你可以Wait的顶级任务。 这是一个可接受的例外通常的准则(这是await ,而不是Wait )。 Wait荷兰国际集团将刻录线程的控制台应用程序的时间,但是这通常没有足够重要,值得更复杂的解决方案。 如果你想安装一个单线程上下文为您的控制台应用程序,你可以使用AsyncContext.Run从我AsyncEx库 。

对于Win32服务,你通常就需要开始自己的线程 。 您可以使用Task.Run这个(如果你想有一个多线程的上下文中),或AsyncContextThread从AsyncEx(如果你想有一个单线程上下文)。



Answer 2:

早上好,

我宁愿使用常规的任务,在你的比异步/ AWAIT模式第一个场景设置为“LongRunning”的TaskCreationOption。 这样,你的整个块,而在将一个长期运行的任务执行。 当使用内部的每个的await while循环,你将开始与每一个环一个新的任务 - 将工作,但它也许不那么最佳;-)

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

希望这可以帮助。



Answer 3:

这是不正常使用循环以保持可能存在fething数据。你可以创建一个异步调用完成后程序自动将调用回调方法..“等待”阶段在这种情况下会在OS的机制发生哪些在最佳方式这个等待阶段治疗的OS使用。

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



文章来源: async await best practices