2016-04-01 12 views
0

Ich bin auf der Suche nach Feedback auf den folgenden Code. Ich habe gelesen here, dass ich die Verwendung von Async void vermeiden sollte.Aufruf der WCF-Methode asynchron

So als Ergebnis habe ich folgendes in einem Verfahren implementiert ..

foreach (var sample in returns) 
{ 
    _logger.Debug("Calling async method"); 
    var resultFromMethodCall = CallMethodAsync(uploadReturn); 
    _logger.Debug("Continuing...."); 

} 




async Task<Tuple<bool,long>> CallMethodAsync(Sample sampleReturn) 
{ 
    try 
    { 
     Service1Client client = new Service1Client(); 
     Tuple<bool, long> results = await client.ValidateSampleReturnAsync(sampleReturn); 
     _logger.Debug("call to Sample Return validator completed for sample: {0}", results.Item2); 
     return results; 
    } 
    catch (Exception ex) 
    { 
     _logger.Error(ex, "Error occured while calling WCF service"); 
     return new Tuple<bool, long>(false, sampleReturn.Id); 
    } 
} 

Wenn ich nichts mit der zurückgegebenen Variablen resultFromMethodCall tun, zeigt die Protokollierung der alle funktioniert, wie ich erwartet. Wenn ich jedoch Objekte aus der Variable resultFromMethodCall auslogge, scheint es jetzt synchron zu laufen, während es darauf wartet, dass das Objekt von dem Aufruf zurückgegeben wird.

Fehle ich etwas offensichtlich hier? Oder verstehe ich völlig falsch, wie das funktioniert.

+0

Der aufrufende Standort wartet auf das Ergebnis der Aufgabe, wenn Sie das Ergebnis der Aufgabe verwenden. Alles, was zwischen dem Aufruf der asynchronen Methode und der Verwendung des Ergebnisses der asynchronen Methode liegt, wird ausgeführt, ohne auf das Ergebnis der Aufgabe zu warten. – Maarten

+0

Vermissen Sie nicht eine Wartezeit in Ihrem Anrufcode? – Maarten

+0

Ist es in Ordnung, dass ich nichts mit dem Ergebnis der Aufgabe mache? Auch das Warten ist in der asynchronen Methode, die aufgerufen wird ... – Fiona

Antwort

1

CallMethodAsync ist korrekt.

Wenn Sie nicht warten (oder warten) resultFromMethodCall Ausführung wird fortgesetzt, während diese Aufgabe noch ausgeführt wird. Ob Sie das zulassen sollten, hängt davon ab, was Sie wollen.

+0

Danke usr. Ich habe eine db voller Datensätze, die validiert werden müssen. Die "Rücksendungen" sind eine Liste von Datensätzen, die validiert werden müssen. CallMethodAsync ruft einen WCF-Dienst auf, der jeden Datensatz überprüft. Der WCF-Dienst aktualisiert die Datenbank mit dem Validierungsergebnis. Das Validierungsergebnis interessiert mich nicht wirklich. In der Theorie würde ich nur die Leere verwenden, aber ich habe gelesen, dass dies nicht die beabsichtigte Verwendung von asynchronen void ist. – Fiona

+0

Ich denke, was Sie wirklich wollen, ist eine große Liste von Elementen mit einer gewissen Menge an Parallelität zu verarbeiten. Dies ist ein Standardproblem. Der einfachste Weg dazu ist 'Parallel.ForEach' in Kombination mit synchronen Aufrufen. Es gibt auch eine Async-Version, aber davon profitieren Sie wahrscheinlich nicht. – usr

+0

Also, wenn ich Parallel.ForEach verwende, würde ich den WCF-Dienst synchrone Operation im Gegensatz zu der asynchronen Operation aufrufen? aka ersetzen Sie die foreach Schleife oben durch eine Parallel.ForEach? (Danke für Ihre Hilfe!) – Fiona

0

Wenn ich jedoch Objekte aus der Variablen resultFromMethodCall auslogge, scheint es, dass es jetzt synchron läuft, während es darauf wartet, dass das Objekt vom Aufruf zurückgegeben wird.

Wenn Sie resultFromMethodCall.Result verwenden, um die Elemente zu erhalten, dann ja, es blockiert und läuft synchron.

Wenn Sie verwenden, um die Elemente zu erhalten, dann wird es nicht synchron ausgeführt. Es läuft jedoch der Reihe nach - was bedeutet, dass die Methode bei await "pausiert" und nur weitergeht, wenn die resultFromMethodCall Aufgabe abgeschlossen ist.

+0

Gute psychische Fehlersuche. Er ruft wahrscheinlich "Result" im Code auf, der nicht gezeigt wird. – usr

+0

Ja ... im Code nicht gezeigt (eine andere Version davon, als ich sehen wollte, was passiert ist, wenn ich die Elemente in resultFromMethodCall.Result abgemeldet habe.) Entschuldigung, ich hätte beide Versionen gelöscht und gepostet werden sollen – Fiona