【问题标题】:What is the difference between calling task-returning method directly and warping the task-returning method with Task.Run?直接调用任务返回方法和用Task.Run扭曲任务返回方法有什么区别?
【发布时间】:2020-12-20 23:51:38
【问题描述】:

我知道 Task.Run 将从线程池中获取一个线程来运行该方法,除此之外,为什么在下面的代码中它需要使用 Task.Run 扭曲返回任务的方法。

我指的是https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md

GOOD Task-returning methods are better since unhandled exceptions trigger the TaskScheduler.UnobservedTaskException.

public class MyController : Controller
{
    [HttpPost("/start")]
    public IActionResult Post()
    {
     *//this line, why wrap it in Task.Run
        Task.Run(BackgroundOperationAsync);*
        return Accepted();
    }
    
    public async Task BackgroundOperationAsync()
    {
        var result = await CallDependencyAsync();
        DoSomething(result);
    }
}

【问题讨论】:

  • 主要区别:你在浪费一个线程并无缘无故地导致线程切换。

标签: .net async-await


【解决方案1】:

除此之外,为什么在以下代码中需要使用 Task.Run 扭曲任务返回方法。

没有充分的理由。由于这是ASP.NET Core,代码大致相当于

_ = BackgroundOperationAsync();

该示例试图说明的主要观点是避免使用async void,而是使用async Task(对于BackgroundOperationAsync)。然而,我认为这个具体的例子是有问题的,因为在 ASP.NET Core 上执行即发即弃根本并不是我所说的“好”解决方案。虽然async Task 略好于async void,但也不是“好的”解决方案。

【讨论】:

    【解决方案2】:

    一个可能的原因是确保整个方法在单独的线程上运行。如果直接调用,第一个await之前的部分会在当前线程上运行。

    在这个特定的示例中,在第一次等待之前没有代码,但我认为这个想法是存在的可能

    【讨论】:

    • 我认为是这个原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2016-03-06
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多