0

請告訴我,它有道理嗎? - 在控制器寫入異步方法,但沒有異步操作,我的意思是下一個記錄:ASP.NET MVC異步任務運行是否有意義?

[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(()=> {x = 5 +5;}))它會異步嗎?

回答

1

一般這沒有意義,並且在操作級別上不是真正的異步,只要您沒有涉及I/O操作。 I/O操作(例如數據庫交互,即SaveChangesAsyncToListAsync)比CPU上的計算花費更長的時間完成,因此CPU花費相當多的時間等待I/O完成。雖然計算5 + 5時沒有等待。

同步完成時,等待會阻塞整個線程。另一方面,異步操作不會阻止它,但切換到其他工作並讓操作系統在請求完成時通知它。然後再從那裏接。這也是運行時成本(上下文切換),所以如果沒有實際的I/O,它通常沒有多大幫助。

一些現實生活的比喻:

我喜歡異步操作(the speech is well worth watching)喬恩斯基特的比薩餅的比喻:一個異步操作訂購比薩餅,雖然它正在編寫並發表看電視。同步操作正在門口等待,直到比薩已經到達。 (或:如果你,而不是訂購比薩餅,纔算5 + 5有在該操作的中間看電視是沒有意義的。)

+0

所以,在Web應用程序異步的全部利益,只能在系統操作(ToListAsync()e.t.c)使用?其餘的方式(在節約資源方面不同步)沒有意義? – user3418560

+0

通常只有在涉及I/O時。簡而言之,您不會節省任何操作的資源。您可以更有效地使用等待時間。我編輯了我的答案,使其更清晰。 –

-1

一般來說,當我們在REST API的使用等待那麼我們將使用異步返回類型

這樣的: -

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

如果我不使用它,而是我只是使用等待Task.Run(()=> {X = 5 5;}))這將是異步?

這就是我所說的「假異步」。也就是說,它行爲喜歡它的異步(返回任務是await版,等等),但實際上它做另一個線程同步工作。

是否有意義?

不,await Task.Run在ASP.NET上做的唯一的事情是導致線程上下文切換,因爲沒有任何好處。所以你會無緣無故地放慢響應時間。

欲瞭解更多信息,請參閱我的article on async ASP.NET節「異步代碼銀彈是不」。