2015-03-03 65 views
1

我已創建Stream的自定義子類,其實現爲Read。 雖然在實現中使用的操作可以很好地利用async API,所以我也想提供ReadAsync實現。在其阻止版本中使用異步實現方法

這些方法共享很多類似的行爲,避免代碼重複的最簡單方法是將實現中的邏輯保存在ReadAsync中,並使用Read實現中的邏輯。這看起來像這樣:

public override int Read(byte[] buffer, int offset, int count) 
{ 
    return ReadAsync(buffer, offset, count).Result; 
} 

這種方法會有什麼影響嗎?由於Read方法應該阻止當前線程,我認爲它完全符合規範。

謝謝!

+2

這可能有所幫助:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html – 2015-03-03 07:04:24

回答

6

這種方法會有什麼影響嗎?

是的,這是sync over async anti-pattern,應該避免。主要原因是它很容易造成死鎖

這怎麼可能?當您阻塞線程時,您的內部ReadAsync可能正在等待異步操作完成。如果此線程是例如UI消息循環線程,則它當前被阻止。當你的await完成時(假設你沒有在內部使用ConfigureAwait(false)),當嘗試回覆它時,它會死鎖。

在編寫異步代碼時,您將有一些代碼重複,沒有得到解決。儘可能嘗試重用。例如,如果兩個代碼方法在開始時都有一個同步部分,則可以將其提取到異步和同步版本將使用的第三個方法。

+0

非常感謝,非常有啓發! :) – 2015-03-03 07:42:46

1

它取決於你的異步方法的實現 - 如果它等待當前線程的東西會出現死鎖。通常最好不要阻止等待異步方法。