C# wait确实执行任务。Run()

C# wait确实执行任务。Run(),c#,C#,我仍在努力完全理解异步/等待方法。有谁能告诉我,在主题中“等待”真的在做任务。落后吗?有时人们在做异步方法,包括等待,但有时看到人们在做任务。在没有异步方法的情况下运行。正确的方法是什么?不,async await只允许代码在其他程序阻塞时运行,而不执行任务。运行或启动新线程 这是一个不错的解释。异步操作符只需在方法中启用等待操作符。wait操作员将处理任何可等待的操作。在.NET中,Task和Task是可等待的一些示例 Task.Run返回Task和Task.Run返回Task,正如我所说,它

我仍在努力完全理解异步/等待方法。有谁能告诉我,在主题中“等待”真的在做任务。落后吗?有时人们在做异步方法,包括等待,但有时看到人们在做任务。在没有异步方法的情况下运行。正确的方法是什么?

不,async await只允许代码在其他程序阻塞时运行,而不执行任务。运行或启动新线程


这是一个不错的解释。

异步操作符只需在方法中启用
等待
操作符。
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; 
}