Chi*_*hin 4 .net c# asynchronous task-parallel-library async-await
我是async/await的新手,我想确保这样做是正确的:
public async Task DoHeavyWorkAsync()
{
await Task.Run(() => {
getResponseFromFarawaySlowServerAndDoSomethingWithIt();
});
}
public async void ConsumeAsync()
{
Task longRunningTask = DoHeavyWorkAsync();
// do a lot of other stuffs here that does not depend on DoHeavyWorkAsync()
await longRunningTask;
}
Run Code Online (Sandbox Code Playgroud)
这种方式是使用异步/等待正确还是我做错了什么?
你可以做几件事:
在DoHeavyWorkAsync,你真的不需要使用生成状态机await Task.Run,你可以简单地return Task.Run:
public Task DoHeavyWorkAsync()
{
return Task.Run(() => getResponseFromFarawaySlowServerAndDoSomethingWithIt());
}
Run Code Online (Sandbox Code Playgroud)async void仅适用于异步事件处理程序.如果你的异步方法正在void返回,它应该返回一个Task:
public async Task ConsumeAsync()
Run Code Online (Sandbox Code Playgroud)如果DoHeavyWorkAsync是基于IO的操作,则不需要将其包装在内部,Task.Run因为它本身是异步的.简单地用await就行了.更重要的是,你不应该做同步异步.相反,Task.Run如果需要,您应该明确使用同步方法的调用者:
public void DoHeavyWork()
{
getResponseFromFarawaySlowServerAndDoSomethingWithIt();
}
Run Code Online (Sandbox Code Playgroud)
然后显式地将它包装在调用方法中:
Task.Run(DoHeavyWork);
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |