Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Task.Run(job)和job()之间有什么不同;等待任务。完成任务?_C#_.net_.net Core_Async Await - Fatal编程技术网

C# Task.Run(job)和job()之间有什么不同;等待任务。完成任务?

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(()=

我想将一个sync函数设置为async

公共工作同步 { //逻辑性很强 } 两者

公共异步作业异步 { 作业同步 等待任务。完成任务; } 及

工作

但这两种方式有什么区别吗

我想将一个sync函数设置为async

此版本根本不是异步的:

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());
}