【问题标题】:ASP.NET MVC Async task run does it make sense?ASP.NET MVC Async 任务运行有意义吗?
【发布时间】:2017-03-30 09:55:03
【问题描述】:

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

 [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;
    }

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

【问题讨论】:

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


    【解决方案1】:

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

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

    一些现实生活中的类比:

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

    【讨论】:

    • 那么,只有在系统操作( ToListAsync() 等)的情况下,才能在 Web 应用程序中使用异步的全部好处?其余的方式(在节省资源异步方面)没有意义?
    • 通常仅在涉及 I/O 时。简而言之,就使任何操作更便宜而言,您不会节省资源。您可以更有效地利用等待时间。我编辑了我的答案以使其更清晰。
    【解决方案2】:

    通常当我们在 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);
        }
    

    【讨论】:

      【解决方案3】:

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

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

      有意义吗?

      没有。 await Task.Run 在 ASP.NET 上所做的唯一一件事就是导致线程上下文切换完全没有任何好处。所以你会无缘无故地减慢响应时间。

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

      【讨论】:

        猜你喜欢
        • 2015-10-02
        • 2011-10-11
        • 1970-01-01
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2020-11-09
        • 2019-11-22
        • 2016-05-02
        相关资源
        最近更新 更多