C# wait确实执行任务。Run()
我仍在努力完全理解异步/等待方法。有谁能告诉我,在主题中“等待”真的在做任务。落后吗?有时人们在做异步方法,包括等待,但有时看到人们在做任务。在没有异步方法的情况下运行。正确的方法是什么?不,async await只允许代码在其他程序阻塞时运行,而不执行任务。运行或启动新线程C# wait确实执行任务。Run(),c#,C#,我仍在努力完全理解异步/等待方法。有谁能告诉我,在主题中“等待”真的在做任务。落后吗?有时人们在做异步方法,包括等待,但有时看到人们在做任务。在没有异步方法的情况下运行。正确的方法是什么?不,async await只允许代码在其他程序阻塞时运行,而不执行任务。运行或启动新线程 这是一个不错的解释。异步操作符只需在方法中启用等待操作符。wait操作员将处理任何可等待的操作。在.NET中,Task和Task是可等待的一些示例 Task.Run返回Task和Task.Run返回Task,正如我所说,它
这是一个不错的解释。异步操作符只需在方法中启用
等待
操作符。wait
操作员将处理任何可等待的操作。在.NET中,Task
和Task
是可等待的一些示例
Task.Run
返回Task
和Task.Run
返回Task
,正如我所说,它们都是可等待的,所以你可以等待它们
如果愿意,您甚至可以编写自己的等待类型:您只需确保满足被视为等待类型的要求。等待者需要为GetAwaiter
提供一个实现,就是这样。这是一个值得期待的问题:
现在你可以这样做了:
// Within some other class
static async void SimpleWaitAsync()
{
SimpleInt32Awaitable awaitable = new SimpleInt32Awaitable();
int result = await awaitable;
}
在某些情况下,您被限制使用async和Wait—这通常是您有时会看到Task.Run被使用的原因—这允许您在同步方法中使用异步代码
当使用MVC进行子操作时,这是一个必要的例子——框架不支持异步子操作,因此必须使用Task.Run调用异步代码
等待真的完成任务。落后吗
其他人已经链接到Cleary关于C#concurrency的许多优秀博客文章中的一篇
不,它不使用任务。在后台运行
await
不仅仅适用于任务。请运行。它用于在完成某项工作后运行代码。这可能是一个使用task.Run
创建的计算任务,但也可能是数据检索,例如使用<代码>任务
是用于对所有这些东西建模的类
Task.Run
是将要在线程池上运行的工作排队。这在编写CPU绑定的代码时是合适的,但是。在这种情况下,您的异步代码(可能使用async/await)应该使用异步IO方法,例如和前面提到的readlinesync
使用Task.Run
在工作线程上运行阻塞代码是一种反模式。你永远不想这么做,即使它真的,比如说,解除了GUI线程的阻塞
有时人们在做异步方法,包括等待,但有时看到人们在做任务。在没有异步方法的情况下运行。正确的方法是什么
您确实可以使用Task创建Task
。运行并让它运行,而不使用wait
或ContinueWith
。这些任务称为“开火并忘记”任务。它们很少是个好主意。与使用wait
时不同,该任务引发的任何异常都将丢失
这是由斯蒂芬·克利里(Stephen Cleary)在中解释的——你猜对了——不,它没有。你可能会发现斯蒂芬·克利里的作品很有帮助。
// Within some other class
static async void SimpleWaitAsync()
{
SimpleInt32Awaitable awaitable = new SimpleInt32Awaitable();
int result = await awaitable;
}