C# Task.Run(job)和job()之间有什么不同;等待任务。完成任务?
我想将一个sync函数设置为async 公共工作同步 { //逻辑性很强 } 两者 公共异步作业异步 { 作业同步 等待任务。完成任务; } 及 工作 但这两种方式有什么区别吗 我想将一个sync函数设置为async 此版本根本不是异步的:C# Task.Run(job)和job()之间有什么不同;等待任务。完成任务?,c#,.net,.net-core,async-await,C#,.net,.net Core,Async Await,我想将一个sync函数设置为async 公共工作同步 { //逻辑性很强 } 两者 公共异步作业异步 { 作业同步 等待任务。完成任务; } 及 工作 但这两种方式有什么区别吗 我想将一个sync函数设置为async 此版本根本不是异步的: public async Task JobAsync() { JobSync() await Task.CompleteTask; } 它将完全同步运行,您只需通过async关键字添加不必要的开销 此版本为假异步: Task.Run(()=
public async Task JobAsync()
{
JobSync()
await Task.CompleteTask;
}
它将完全同步运行,您只需通过async关键字添加不必要的开销
此版本为假异步:
Task.Run(()=>JobSync())
Run只是在线程池上运行同步代码。但是,它会在运行JobSync之前返回一个任务,如果您的目标是一个UI应用程序,这会很有用,因为在JobSync运行时释放UI线程
这里真正的问题是为什么要使JobSync异步,答案是不应该
当方法涉及I/O时,异步就有了自己的功能,因为线程可以在等待响应的同时被释放以处理其他工作
如果JobSync是一种昂贵的CPU绑定方法,它会冻结您的UI,只需使用Task调用它即可。运行:
根据评论更新
如果目标API需要任务返回方法,如BackgroundService.ExecuteAsync,则Task.FromResult是最有效的解决方法:
public override Task ExecuteAsync(CancellationToken ct)
{
return Task.FromResult(JobSync());
}
这只是简单地将JobSync的结果放在任务对象中,以满足ExecuteAsync的要求,但不会不必要地强制代码在线程池上运行。首先将在同一线程上运行,其次将创建新线程以运行给定的方法。谢谢,我使用它来适应BackgroundService。ExecuteAsync方法,我的意思是有时方法签名需要param异步,或者需要返回Task,这就是Task.FromResult的方式。请参见上面的更新。这是否意味着Task.FromResult将使JobSync在专用线程或当前线程上运行?@Panic Task.FromResult也是一个同步方法,它只是创建了一个任务对象,并设置其结果属性。没有线程切换发生,这正是您想要的,考虑到它已经在后台运行。
await Task.Run(JobSync);
public override Task ExecuteAsync(CancellationToken ct)
{
return Task.FromResult(JobSync());
}