2016-05-06 15 views
2

Ich implementiere System.Web.UI.IPostBackEventHandler auf einer meiner Klassen und im Körper meiner Implementierung von void RaisePostBackEvent (string eventArgument) I am calling a method using the async ... erwarten `Syntax. Z.B.Schnittstellenimplementierungen asynchron machen

public void RaisePostBackEvent(string eventArgument) 
{ 
    if (eventArgument.Equals("deq1")) 
    { 
     Result result = await SaveDataAsync(); 
     OnSaved(); 
    } 
} 

erzeugt jedoch den Fehler:

CS4033 - The 'await' operator can only be used within an async method

CS4033 - The 'await' operator can only be used within an async method

Die Frage: Making interface implementations async ein fast identisches Problem Mine beschreibt, mit dem wesentlichen Unterschied ist, dass die Schnittstelle durch die OP umgesetzt war unter seiner Kontrolle, und die accepted answer war zu ändern void DoSomething() auf der Schnittstelle zu Task DoSomething(). Ich kann jedoch nicht die IPostBackEventHandler ändern, da es Teil des .NET Framework ist.

Irgendwelche Vorschläge, wie Sie das auf sichere Weise lösen können?

Antwort

3

können Sie fügen den async Modifikator auch wenn es nicht in der Schnittstelle definiert ist.
Berücksichtigen Sie bitte, dass RaisePostBackEvent void zurückgeben muss, damit es als "fire and forget" Anruf funktioniert. Wenn das kein Problem ist, fügen Sie einfach den Modifikator async der Signatur hinzu.

public async void RaisePostBackEvent(string eventArgument) 
{ 
    if (eventArgument.Equals("deq1")) 
    { 
     Result result = await SaveDataAsync(); 
     OnSaved(); 
    } 
} 
+0

Was passiert, wenn während des Speichervorgangs eine Ausnahme auftritt? Wie könnte ich damit umgehen? –

+0

Sie möchten es auf die gleiche Weise behandeln? Probieren Sie einfach einen Fang. Sie können innerhalb des Versuchs warten verwenden. – pomber

+1

Aufruf von OnSaved() ist keine gute Idee. Siehe Stephen Cleary Antwort in [this] (http://stackoverflow.com/questions/19415646/should-i-avoid-async-void-event-handlers) SO Frage und [diese] (https://msdn.microsoft. com/de-de/magazin/jj991977.aspx) MSDN-Seite. –

1

Wenn Ihre Methodenimplementierung NICHT asynchron ist, können Sie nicht darauf "warten". Sie können Ihre Methodenimplementierung asynchron void machen, selbst wenn die von Ihnen implementierte Schnittstelle nicht asynchron ist. Sie können Ihre Methodenimplementierung nicht asynchron ausführen, da dies den Rückgabewert ändert, der schlecht ist.

Das Ergebnis der Asynchronisierung Ihrer Methodenimplementierung ist, dass der Aufrufer nicht auf die Beendigung der Methode wartet, bevor er zurückkehrt. Versuch:

public async void RaisePostBackEvent(string eventArgument) 
{ 
    if (eventArgument.Equals("deq1")) 
    { 
     Result result = await SaveDataAsync(); 
     OnSaved(); 
    } 
} 
+0

Was passiert, wenn während des Speichervorgangs eine Ausnahme auftritt? Wie könnte ich damit umgehen? –