Laden...

TaskCompletionsource nach benutzen nochmal verwenden

Erstellt von filmee24 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.161 Views
F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 5 Jahren
TaskCompletionsource nach benutzen nochmal verwenden

hallo,

ich hab einen kleinen rpc service mit memory mapped files geschrieben.
das problem ist, dass man nur eine methode ausführen kann, da der TaskCompletionSource ne Exception wirft, sobald einmal der Result gesetzt wurde.

Hier mal mein Code:


TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
private void Sender_DataReceived(object sender, MemoryMappedDataReceivedEventArgs e)
        {
            var response = (RpcMethodAwnser)RpcServices.Deserialize(e.Data);

            tcs.SetResult(response.ReturnValue); // Exception: Kann nicht gesetzt werden, weil Task bereits abgeschlossen ist
        }

der communicator ist vom MemoryMappedFile Sample von Microsoft.

Vielleicht kann mir jemand helfen.

Vielen Dank

Hinweis von Coffeebean vor 5 Jahren

Ich habe den Codelink mal entfernt. Bitte beachte [Hinweis] Wie poste ich richtig? und poste die relevanten Codestellen mit den entsprechenden Tags bitte im Beitrag. Danke!

C. Anders

F
filmee24 Themenstarter:in
51 Beiträge seit 2011
vor 5 Jahren

*edit erledigt, hab die TCS durch ein ManualReset Ersetzt

C. Anders

6.911 Beiträge seit 2009
vor 5 Jahren

Hallo filmee24,

noch als Ergänzung:

TaskCompletionSource ne Exception wirft, sobald einmal der Result gesetzt wurde.

Das ist auch gut so, denn die TCS lässt sich nur einmal verwenden. Sie ist eben ein Produzent für einen Task, der zugleich auch dessen Endstatus steuert (Completed, Exception, ...).
Könnte mit einer TCS mehrere Tasks "gesteuert" werden, so würde das die Tür für jede Menge Bugs, bedingt durch Race conditions, öffnen. Daher wurde dieses Verhalten unterbunden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"