2017-07-25 46 views
3

我想了解異步/等待。我知道你不應該等待一個CPU限制的方法,但爲了幫助我理解,我很好奇如果你這樣做會發生什麼。考慮:VB.NET:如果我使用Await運行CPU綁定代碼會發生什麼?

Public Async Function DoSomeTasks() 
    Await LongRunningCPUBoundMethod1() 

    LongRunningCPUBoundMethod2() 
End Function 

Public Async Function LongRunningCPUBoundMethod1() As Task 
    ' Do stuff synchronously 
End Function 

Public Sub LongRunningCPUBoundMethod2() 
    ' Do stuff synchronously 
End Sub 

Task Scheduler如何處理CPU資源?這些方法以什麼順序執行? LongRunningCPUBoundMethod1或LongRunningCPUBoundMethod2會先執行嗎?

+1

不等待[等待任務完成](https://docs.microsoft.com/en-us/downloads/default.aspx)。com/en-us/dotnet/csharp/language-reference/keywords/await),直到完成剩下的任務? –

+0

是的,等待強制任務對象解析其結果。如果您沒有等待,那麼由LongRunningCPUBoundMethod1()返回的對象將成爲任務對象。 – victor

+0

認爲這篇文章https://blog.stephencleary.com/2012/02/async-and-await.html(和其他在同一頁)將解釋你這個專題。 –

回答

5

這裏要記住的是Async/Await代碼不一定是多線程的。您可以通過等待啓動單獨線程的項來使用它們來幫助實現多線程代碼,但是他們真正做的是讓您在同一個線程中有效地分解多個任務。

這不是沒有一些開銷;在異步任務之間切換會產生成本。當你等待cpu-bound任務時,你已經將這個成本加到了已經cpu密集型的工作中,因此使事情變得更糟而不是更好。但是,如果將此代碼與在單獨的線程中啓動cpu繁重任務的代碼結合使用,然後使用WaitHandle或Task將結果發送回來,則可能會再次變爲(具體取決於您有多少項等待相對於可用內核的數量),因爲現在你正在利用CPU中的多個內核。

此外,讓我們看看.Net WinForms的上下文。在這裏記住你很重要,你永遠不想在主UI線程上做重要的CPU工作。真的,什麼塊超過幾毫秒是有問題的。如果該線程繁忙,則Windows消息泵不會運行,您無法響應事件,並且用戶界面無響應。

要了解Await在這種情況下,想想它就好像它將您的方法分成兩部分(或更多,如果有多個Await)。一切等於和包括Await的行都立即運行,並且等待後的所有內容都被編譯器以一種新的回調方法隱藏起來(稱爲繼續),該回調方法將使用相同的上下文(包括原始的本地變量方法),並在Await完成時在同一個線程中。

有了這些信息,應該清楚的是,如果您直接使用Await一種cpu綁定方法,您仍然在UI線程上立即執行該工作,並且您的用戶界面仍然存在問題。但是,您可以通過在自己的線程中啓動cpu-bound方法來解決此問題。 AwaitTask一起使用,不需要編寫大量新代碼就可以輕鬆完成。當然,它比舊的DoEvents()技術好得多。

+1

tl; dr:對於CPU繁重的方法,請使用'等待Task.Run(Function()CpuHeavyMethod(args))'或'等待Task.Run(Async Function()=> AsyncCpuHeavyMethod(args))''。 –

1

執行順序。

1)LongRunningCPUBoundMethod1()

2)LongRunningCPUBoundMethod2()

繼承人你怎麼可以亂用程序流和excution

var task = LongRunningCPUBoundMethod1(); 
LongRunningCPUBoundMethod2(); 

var result = await task; 
// now result contains what was returned by LongRunningCPUBoundMethod1() 

對不起,我不知道如何等待/異步會影響CPU資源。

+0

這是一個比我的更好的例子!任何人都可以在這裏看到CPU會發生什麼? Method1會阻止Method2嗎? – Kevin

相關問題