So werfen Sie eine Ausnahme aus dem Rückruf in WCF Async mit IAsyncResult

8

Ich verwende WCF Async-Aufrufe in meinem Projekt und ich verwende asynchrone Client-Seite-Methoden. Ich habe ein Szenario wie unten -

%Vor%

Wie im obigen Codefragment gezeigt, wird die Ausnahme nicht von der Business-Schicht zur Web-Schicht geworfen, da sie hier in der Business-Schicht selbst unterdrückt wird.

Ich habe einige der Blogs und Websites eingecheckt, die für async vorgeschlagen werden, und erwarte den Ansatz, da ich über .NET 4.0 Framework verfüge und die Option " Taskbasierte Vorgänge generieren" deaktiviert ist . Wenn also Optionen mit "IAsyncResult" (Begin & amp; End auf der Client-Seite) vorhanden sind, lassen Sie es mich bitte wissen. Wenn es auch andere Ansätze gibt.

Bitte jemand mir helfen.

Danke.

    
Abhijith Nayak 06.04.2015, 17:53
quelle

3 Antworten

0

Jedenfalls habe ich das mit TPL (Task Parallel Library) gelöst.

Grund, dass ich Probleme in dem obigen Ansatz bekam, ist, dass meine neuen Threads den Haupt-Thread nicht erkennen können, von welchem ​​Layer die Methode aufgerufen wurde. Also benutze ich TPL, um meinen Haupt-Thread zu warten, bis meine anderen Threads den Job machen und zurückkommen und dann basierend auf der Antwort die Exception werfen.

Ich hoffe, es hilft.

    
Abhijith Nayak 21.04.2015, 20:26
quelle
2

Hier ist eine Beispiel-App, die zeigt, dass WCF die Ausnahme nicht verschluckt. Wenn Sie die Ausnahme nicht erhalten, muss sie von Ihrem serverseitigen Code verschluckt werden.

%Vor%

}

Hier ist die Ausgabe dieses Programms:

%Vor%     
Alon Catz 16.04.2015 18:02
quelle
0

1) Wenn Sie WCF-Client-Code bereits mit Async-Methoden ("Begin ..." / "End ...") generiert haben, können Sie die Task-API von TPL verwenden, um mit WCF (ContinueWith usw.) über Task zu arbeiten .Factory.FromAsync ( Beispiel ) - gut für die Behandlung von Legacy-IAsyncResult (" Begin ... "/" End ... ") Methoden / APIs (simple, obwohl Sie Quelle mit Reflektor sehen können);

2) Vom Tool generierter Client-Code ist kein guter Ansatz - stattdessen können Sie Ihren eigenen universellen Client-Proxy mit True-Async-Unterstützung schreiben (nicht nur Hintergrund-Thread verwenden). Hier ist ein gutes Beispiel, wie Sie beginnen, Sie brauchen "Anfang" ... / "End ..." Methoden mit aufgabenbasierten Methoden (verwenden Sie die gleiche Task.Factory.FromAsync) und benutzen Ausdrucksbäume, um string-basierte Methodenaufrufe zu löschen (ich kann meine Klassenquelle nicht teilen).

Oder Sie können bestehende Lösungen wie dies verwenden.

3) Vergessen Sie nicht ConfigureAwait .

Bearbeiten:

Sie müssen keine aufgabenbasierten Vorgänge generieren, es reicht aus, WCF-Clientcode mit asynchronen Dienstoperationsmethoden zu generieren ("Begin ..." / "End ..."). Oder Sie können sogar nur einen synchronen WCF-Vertrag haben! (siehe Links). TPL in .NET 4 verfügbar (ohne async / erwarten Sie syntaktischen Zucker - das ist CSharp 5.0 Sprachfunktion). Verwenden Sie es (ContinueWith statt warten + WhenAny, WhenAll). Ich habe es sogar in 3.5 über Microsoft Reactive Extensions v1.0.2856.0 verwendet. AFAIK Reactive Extensions war die erste Version, die in BCL enthalten war. ParallelExtensionsExtras kann ebenfalls nützlich sein

    
SalientBrain 13.04.2015 08:29
quelle