Es scheint wie direkt nach dem Aufruf meiner ersten asynchronen Methode (GetBar()
in diesem Beispiel) die IsCancellationRequested
der CancellationToken auf True festgelegt ist, aber ich will das nicht und verstehe nicht, warum es passiert.Warum wird dieses CancellationToken storniert?
Dies ist in einer Azure Cloud Service-Worker-Rolle, wenn dies von Bedeutung ist.
Ich habe CancellationTokens schon einmal in einem anderen Projekt erfolgreich verwendet und ich verwende ein ähnliches Setup hier. Der einzige Unterschied, den ich kenne, ist, dass es sich um einen Azure Cloud Service handelt. Irgendeine Idee, warum IsCancellationRequested
auf wahr gesetzt wird?
Welcher andere Code berührt 'cancellationTokenSource' neben den zwei Zeilen, die Sie in' Run() 'gezeigt haben, kann' Run() 'auch mehrfach aufgerufen werden? Wenn ich raten müsste, würde ich sagen, dass Sie eine Race Condition mit dem 'this.cancellationTokenSource.Token' innerhalb des Lambadas haben und dies bewirkt, dass der Token in' Foo.Bar '('um nicht das gleiche Token zu sein, das übergeben wurde) übergeben wird als der zweite Parameter von 'Task.Run (' –
Erhalten Sie eine Ausnahme für 'GetBar' geworfen? Überprüfen Sie dies, und sehen Sie, ob es hilft: http://StackOverflow.com/questions/13489065/best-Practice- to-call-configurateawait-für-alle-server-side-code –
Könnte 'OnStop' nach Ihrem Update aufgerufen worden sein, während Sie auf' FooService.GetBar() 'gewartet haben? Vielleicht fügen Sie eine Form der Protokollierung hinzu, um zu sehen wenn 'OnStop' vor dem' token.ThrowIfCancellationRequested(); 'aufgerufen wird und nach dem' var bar = await ... ' –