C# 使用异步void方法运行长寿命操作
使用C# 使用异步void方法运行长寿命操作,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,使用async void方法启动一些长期运行的操作是否合适?我知道或Task.Run()可以用于从非异步方法运行任务。有什么区别?有什么陷阱吗 我的意思是,我能这样写吗: 在任何情况下,最好使用async Task来获得更好的错误处理行为。您不需要等待生成的任务 在您的代码段中,注释将在第一次等待后立即在条形图中继续不一定正确。由于bar中没有等待,因此它将同步执行并阻止foo 启动长时间运行的操作需要使用异步IO或以某种方式使用新线程/任务(task.Run是合适的).为什么不执行异步任务而
async void
方法启动一些长期运行的操作是否合适?我知道或Task.Run()
可以用于从非异步方法运行任务。有什么区别?有什么陷阱吗
我的意思是,我能这样写吗:
在任何情况下,最好使用
async Task
来获得更好的错误处理行为。您不需要等待生成的任务
在您的代码段中,注释将在第一次等待后立即在条形图中继续
不一定正确。由于bar
中没有等待,因此它将同步执行并阻止foo
启动长时间运行的操作需要使用异步IO或以某种方式使用新线程/任务(
task.Run
是合适的).为什么不执行异步任务
而只是不等待bar?@ScottChamberlain但如果以后在代码中不等待,它会异步启动吗?执行异步无效和执行异步任务而不等待返回的任务具有完全相同的行为。调用wait不会启动任务,它会等待已启动的任务完成。这就是为什么如果你在一个以new task()
启动的任务上调用wait,并且从来没有调用过.Start()
,那么wait将永远等待,因为任务没有运行。+1我记得Stephen Toub对async/wait的评论:“c中没有关键字启动线程-应该有一些API调用(task.Run(),File.ReadAsync()…)
async void bar()
{
try
{
//...
}
catch (Exception ex)
{
// no rethrowing here
}
}
void foo()
{
bar();
// will continue right after 1st await in bar()
baz();
}