2011-06-29 41 views
2

基本上,如果我調用一個異步方法,我的應用程序不會掛起,我可以點擊事物和這樣的(如果我允許的話)而不會受到懲罰。異步操作完成後,將執行回調方法。C#:異步回調 - 回調方法的處理是否阻止應用程序?

我想知道如果這再次阻塞的東西還是它仍然是「異步」?也就是說,回調方法非常密集,我的應用程序仍然可以很好地運行,或者一旦回調方法被輸入,它會被阻止?


更新:

什麼我說的是當你添加一個服務引用,並選擇「異步操作」

public void AsyncSaveFooCompleted(Object sender, SaveFooEventArgs e) 
{ 
    //Send a large binary from the WCF Service 
    Client.SaveFooBinary(Foo.LargeBinary); 
} 

public void SaveFoo(Foo foo) 
{ 
    Client.SaveFooAsync(foo); 
} 
+1

這真的取決於您正在運行的異步操作的類型?你使用新的線程()? –

+0

非常模糊的問題。這掛在細節上,所有這些都不見了。 –

+0

對不起,我更新了我在說的... – michael

回答

3

您將有某種阻塞,如果創建的方法你的回調是密集的。如果您遇到此問題,請在異步方法中移動更多處理,並使回調更加簡單。

或者,如果您需要分階段處理此問題,請使用不同的回調啓動另一個異步過程。

1

我假設你在談論C#5異步方法...

回調將默認執行UI線程上。這聽起來像你應該把昂貴的工作放到它自己的任務中(例如用TaskEx.Run),然後等待...假設在UI線程上執行重處理並不是。如果你從UI線程中獲得了大量基礎工作,那麼你可以做的事情並不多。

+0

不,對不起......我不是。我更新了我的問題,以反映我正在談論的內容。我將我的WCF服務分成一個Save和一個SaveLargeBinary ......這樣,如果由於唯一約束而導致保存失敗,我不會浪費時間序列化一個大的二進制文件。我寧願知道前面並跳過SaveLargeBinary。 – michael

3

回調方法不應該是密集的。在我看來,你的線程應該處理它的密集處理,並讓回調只是渲染邏輯。

0

你的問題有點含糊,因爲你沒有解釋你是如何執行異步操作的。如果你像Jon Skeet所建議的那樣在C#5.0中使用新的異步方法,那麼遵循他的建議,但如果不是,那麼測試(最簡單的方法就是做異步)的方法是在回調中拋出一些阻塞代碼。

沿着Thread.Sleep(10000)的方向,你會立即知道你的回調是否會阻塞UI線程。儘管如此,除非用戶由於某項任務的要求而無法繼續或執行任何操作,直到操作完成爲止,否則UI線程應該永遠不會「密集」工作,那麼這並不重要,因爲用戶必須等待兩種情況。然而,你仍然可以考慮這種糟糕的設計,因爲任何UI用戶在UI線程上進行大量工作都會得到臭名昭着的「Not Responding」,並且用戶可能會停止工作,即使它仍在執行任務。