ASP.NET MVC异步任务运行有意义吗?

时间:2016-11-16 09:15:43

标签: asp.net-mvc async-await task-parallel-library task threadpool

请告诉我,它有意义吗? - 在控制器写异步方法但没有异步操作,我的意思是下一条记录:

 [HttpPost]
    public async Task<ActionResult> SendTask(TaskModel taskModel)
    {
        MailTask task = taskModel.BuildTask();

        await Task.Run(() =>
        {
                task.Send(); // <- it is not async method

               // bla bla bla... my other no async code
        });

        return _jsonDataResult;
    }

有意义吗?我只是在运行动作,在我的任何代码中。 我一直看到在'await'之后到处调用“ToListAsync()或SaveChangesAsync()”的示例 - 它是.NET异步操作。但如果我不使用它,而是我只使用等待Task.Run(()=&gt; {x = 5 + 5;}))它将是异步的吗?

3 个答案:

答案 0 :(得分:3)

  

如果我不使用它,而是我只使用等待Task.Run(()=&gt; {x = 5 + 5;}))它将是异步的吗?

这就是我所谓的“假异步”。也就是说,它行为就像是异步的(返回await编辑的任务,等等),但实际上它正在另一个线程上进行同步工作

  

有意义吗?

没有。 await Task.Run在ASP.NET上唯一能做的就是导致线程上下文切换完全没有任何好处。因此,您无缘无故地减慢响应时间。

有关详细信息,请参阅article on async ASP.NET的“异步代码不是银弹”部分。

答案 1 :(得分:1)

通常这没有意义,并且只要您没有涉及I / O操作,就不会在操作级别上真正异步。 I / O操作(例如数据库交互,即SaveChangesAsyncToListAsync)需要比CPU上的计算完成更长的时间,因此CPU花费相对大量的时间等待I / O完成。虽然在计算5 + 5时没有等待。

同步完成时等待阻止整个线程。另一方面,异步操作不会阻止它,但切换到执行其他工作并让操作系统在请求完成时通知它。然后再从那里拿起。这也是运行时成本(上下文切换),因此如果没有实际的I / O,它通常不会有太多帮助。

一些现实生活中的类比:

我喜欢Jon Skeet关于异步操作的披萨比喻(the speech is well worth watching):异步操作是在准备和发送电影时订购比萨饼和看电视。同步操作正在门口等待,直到比萨饼到达。 (或者:你应该,而不是订购披萨,只计算5 + 5,在那次操作过程中看电视是没有意义的。)

答案 2 :(得分:-1)

通常,当我们在REST API中使用await时,我们将使用异步返回类型

像这样: -

 static async void ProcessDataAsync()
    {
    // Start the HandleFile method.
    Task<int> task = HandleFileAsync("C:\\enable1.txt");

    // Control returns here before HandleFileAsync returns.
    // ... Prompt the user.
    Console.WriteLine("Please wait patiently " +
        "while I do something important.");

    // Wait for the HandleFile task to complete.
    // ... Display its results.
    int x = await task;
    Console.WriteLine("Count: " + x);
    }