Sas*_*ash 5 .net c# frameworks asynchronous async-await
我已经掌握了异步等待的概念并且偶尔使用它,但确实有一些关于最佳实践的问题.
是否可以在while(条件)循环中使用await来继续获取可能存在的数据,直到while条件发生变化,例如stopProcessingMessages = false.
在诸如winforms之类的应用程序中,当UI在它的线程上运行时,在按钮单击等操作上使用async/await是相当简单的,但是如果我想在整个控制台应用程序,甚至是窗口中异步执行,那该怎么办呢?服务.什么是最初开始第一次等待任务的最佳做法,那就是Task.Run(()=> ...)?
我希望我在第二个问题上有意义.我想充分利用异步并充分利用它,但只需要了解如何在它向所有其他异步函数冒泡之前启动初始异步操作.
不使用正确的代码块道歉我在火车上使用我的智能手机.
我已经掌握了异步等待的概念并且偶尔使用它,但确实有一些关于最佳实践的问题.
我有一个介绍async/ await博客文章比大多数介绍更详细,并介绍了几个最佳实践.
是否可以在while(条件)循环中使用await来继续获取可能存在的数据,直到while条件发生变化,例如stopProcessingMessages = false.
你想避免紧密循环.所以while (condition) GetDataIfPresent();它将消耗大量的CPU.
或者,您可以使用async返回null(或其他)的stopProcessingMessages方法true.在这种情况下,您的代码将是while (true),并且将使用更类似于TAP的解决方案CancellationSource而不是标志.
另请参阅TPL Dataflow ; 听起来它可能对你的情况有用.
控制台应用程序,甚至是Windows服务.什么是最初启动第一次等待任务的最佳做法
对于控制台应用程序,您可以Wait执行顶级任务.这是通常指南的可接受的例外(await代替Wait).Waiting将在控制台应用程序的持续时间内刻录一个线程,但这通常不足以保证更复杂的解决方案.如果您确实要为控制台应用程序安装单线程上下文,则可以AsyncContext.Run从我的AsyncEx库中使用.
对于Win32服务,您通常需要启动自己的线程.您可以使用Task.Run此方法(如果需要多线程上下文),也可以使用AsyncContextThreadAsyncEx(如果需要单线程上下文).