我想使同步功能异步
public JobSync()
{
// a lot of logic
}
两者
public async JobAsync()
{
JobSync()
await Task.CompleteTask;
}
和
Task.Run(()=>JobSync())
有效
但是两种方法之间有什么区别吗?
答案 0 :(得分:7)
我想使同步功能异步
此版本完全不是异步的:
public async Task JobAsync()
{
JobSync()
await Task.CompleteTask;
}
它将完全同步运行,您只需通过async
关键字添加不必要的开销即可。
此版本为“伪异步”:
Task.Run(()=>JobSync())
Task.Run
仅在线程池上运行同步代码。但是,它确实会在运行Task
之前返回一个JobSync
,这对于您以UI应用为目标很有用,因为UI线程是在JobSync
运行时释放的。
这里真正的问题是为什么您想使JobSync
异步,答案是您不应该。
当该方法涉及I / O时,异步就产生了,因为可以在等待响应的同时释放线程以处理其他工作。
如果JobSync
是冻结CPU的昂贵的CPU绑定方法,只需使用Task.Run
进行调用即可:
await Task.Run(JobSync);
根据评论更新
如果您定位的API需要返回Task
的方法,例如BackgroundService.ExecuteAsync
,那么Task.FromResult
是最有效的解决方法:
public override Task ExecuteAsync(CancellationToken ct)
{
return Task.FromResult(JobSync());
}
这只是将JobSync()
对象中的Task
的结果转为满足ExecuteAsync
的要求,但不会强制代码不必要地在ThreadPool上运行。