2014-05-17 14 views
17

According to an article in MSDN Magazine, ist es die beste Praxis "ConfigureAwait(false) zu verwenden, wenn Sie können." Außerdem heißt es: "Wenn Sie ConfigureAwait irgendwann innerhalb einer Methode verwenden können, dann empfehle ich, dass Sie sie nach diesem Punkt für alle Wartezeiten in dieser Methode verwenden." Stephen Cleary, der Autor dieses Artikels, states on his blog, dass „In Ihrer ‚Bibliothek‘ Asynchron-Methoden verwenden ConfigureAwait (false), wo immer möglich [Hervorhebung hinzugefügt].“Set ConfigureAwait (false) für gesamtes Projekt/dll

Da die meisten oder alle meine await Aussagen in einer Bibliothek-Projekt, das weit sollte gemeint ist .ConfigureAwait(false) verwendet werden müssen, ist es möglich, es zu tun, ändern etwas/eine Einstellung zu machen, so dass das Standardverhalten in meinem Projekt erwarten/dll soll nicht auf dem aufgezeichneten Kontext fortgesetzt werden? Das heißt, so dass ich alle Anrufe zu .ConfigureAwait(false) weglassen und stattdessen nur hinzufügen könnte, wenn ich den Kontext beibehalten möchte.

Antwort

14

Nein, es gibt keine Option dafür. Das Microsoft-Team hat eine Compiler-Einstellung oder etwas für dieses Verhalten in Betracht gezogen, aber es abgelehnt.

Der Hauptgrund ist, dass es ziemlich schwierig ist zu sagen, wie sich der Code verhält, ohne zu wissen, wie der Compiler-Schalter gesetzt ist.

+5

Es wäre sicher nützlich, wenn es ein Attribut gäbe, das wir auf eine Klasse oder Funktion anwenden könnten, die den Standardwert von ConfigureAwait spezifiziert hat. –

+0

Es kann gut sein, ConfigAwait (false) in einem Testframework zu testen. Jeder weiß, ob diese Funktionalität in irgendeinem Framework existiert. –

+1

@AbdulSaboor: In diesen Tagen gibt es Code-Analysatoren, die Sie zwingen können, 'ConfigureAwait' (entweder' true' oder 'false') zu verwenden, um es explizit zu machen. Ich persönlich benutze sie nicht, aber ich kann ihren Vorteil sehen, besonders bei größeren Teams. –

11

Es gibt jetzt eine Third-Party-Bibliothek, die dies unterstützt. Das Nuget-Paket ConfigureAwait.Fody ermöglicht es Ihnen, ein ConfigureAwait-Attribut zu verwenden, um eine Klasse, eine Assembly oder eine Methode so zu markieren, dass alle erwarteten Werte .ConfigureAwait(false) sind. Die project page hat dieses Beispiel Nutzung:

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); 
    } 
} 

ich das nicht selbst versucht haben, aber wenn man bedenkt, was ich weiß, wie Fody Add-Ins arbeiten, ist es sicherlich möglich.

+3

Die ConfigureAwait.Fody ist eine gute Idee, aber aktuelle Implementierung ist fehlerhaft und scheint nicht aktiv –

+0

unterstützt Und aus diesem Grunde, es wurde nicht angeführt von nuget. – AgentFire

Verwandte Themen