2014-05-17 92 views
17

According to an article in MSDN Magazine,這是「儘可能使用ConfigureAwait(false)」的最佳做法。此外,它指出:「如果您可以在某個方法的某個位置使用ConfigureAwait,那麼我建議您在該方法之後的每個等待中都使用它。」 Stephen Cleary,該文章的作者,states on his blog,即「在您的'庫'異步方法中,儘可能使用ConfigureAwait(false)[強調添加]。」爲整個項目/ dll設置ConfigureAwait(false)

鑑於大多數或所有我在一個庫項目await聲明,是爲了得到廣泛的應用應該有.ConfigureAwait(false)的是有可能做一些事情/更改設置,使之讓我的項目中等待的默認行爲/ dll是不是繼續捕獲的上下文?也就是說,我可以省略所有對.ConfigureAwait(false)的呼叫,而是隻在需要保留上下文時才添加.ConfigureAwait(true)

回答

14

不,沒有這個選項。微軟團隊確實考慮過一個編譯器設置或某種行爲,但最終拒絕了它。

最主要的原因是,如果不知道編譯器開關是如何設置的,就很難說出代碼的行爲。

+5

如果有一個屬性我們可以應用於指定ConfigureAwait默認值的類或函數,那肯定會很有用。 –

+0

可能很適合在任何測試框架中測試ConfigAwait(false)。任何人都知道,如果這種功能存在於任何框架中。 –

+1

@AbdulSaboor:現在有些代碼分析器可以強制你總是使用'ConfigureAwait'('true'或'false')來明確它。我個人不會使用它們,但我可以看到他們的好處,特別是在大型團隊中。 –

11

現在有一個支持這個的第三方庫。 ConfigureAwait.Fody Nuget包允許您使用ConfigureAwait屬性來標記類,程序集或方法,使所有等待的應該是.ConfigureAwait(false)。該project page有此用法示例:

using Fody; 

[ConfigureAwait(false)] 
public class MyAsyncLibrary 
{ 
    public async Task MyMethodAsync() 
    { 
     await Task.Delay(10); 
     await Task.Delay(20); 
    } 

    public async Task AnotherMethodAsync() 
    { 
     await Task.Delay(30); 
    } 
} 

我沒有嘗試這樣做我自己,但考慮到我所知道的關於如何Fody加載項工作,這當然是可能的。

+3

ConfigureAwait.Fody是一個好主意,但是目前的實現方式很麻煩,似乎沒有被主動支持 –

+0

因此,它從nuget中沒有列出。 – AgentFire

相關問題