2009-09-03 25 views
15

我最近注意到了以下的模式,但我並不完全掌握CompletedSynchronously屬性的用法:再次的AsyncCallback CompletedSynchronously

IAsyncResult channelOpenResult = channel.BeginOpen(new AsyncCallback(OnOpenCompleteChannel), channel); 
if (channelOpenResult.CompletedSynchronously) 
{ 
    CompleteOpenChannel(channelOpenResult); 
} 

,然後在回調:

void OnOpenCompleteChannel(IAsyncResult result) 
{ 
    if (result.CompletedSynchronously) 
     return; 
    else 
     CompleteOpenChannel(result); 
} 

代碼中的某處當然有一個功能:

void CompleteOpenChannel(IAsyncResult result) ... 

這是一種處理方法異步調用取決於它是否直接完成?但是爲什麼在這種情況下使用它,因爲AsyncCallback總是會被調用(是嗎?)? 有人可以舉一個例子,呼叫是同步進行的嗎?

回答

8

請參閱this blog。常見模式在循環中執行異步工作,並且檢查CompletedSynchronously有助於避免出現「不幸」的情況,並且發生一堆異步調用以完成同步並可能導致StackOverflowException異常。 (例如,如果您通過網絡讀取數據,並且您正在閱讀的數據已經通過網絡傳輸並被緩存,則異步調用可能會同步完成,這意味着您的回調會在同一個線程上調用(具有較高堆棧),這意味着你最好不要在一個循環中安排另一個異步調用。)

0

根據此document,您可以使用同步和ASync回調提供呼叫,並且只有在呼叫未被同步處理時,它纔會調用ASync方法。我不認爲這真的適用於Silverlight(因爲所有的Silverlight調用都是在一定程度上是ASync),但可能更多地用於其他.NET應用程序中的自定義工廠。

希望這會有所幫助。