問題タブ [cancellationtokensource]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - キャンセルトークンの停止はどのように続行しますか?
私はこのコードでスレッドを持っています:
return
の代わりにを使用していることに注意してください。break
スレッドを停止すると、 をsome operation 2
実行してはならないからです。
また、このように .ContinueWith が実行されていないことにも気付きました。
まあ、それは単なる「リターン」機能です。tokenSource.Cancel()
C#は、通常の戻りではなく、戻りが原因で戻っていることをどのように知ることができますか?
c# - async/await、CancellationTokenSource、Threading.Timer の組み合わせによるデッドロック
特定の条件が成立している間 (定期的に検証する必要があります) 実行することになっている任意のキャンセル可能なコードのラッパーを作成する過程でCancellationTokenSource
、 、Threading.Timer
、およびasync
/await
生成コード間の相互作用で興味深い動作に遭遇しました。
簡単に言うと、待機中のキャンセル可能Task
オブジェクトがあり、それをコールバックTask
からキャンセルするとTimer
、キャンセルされたタスクに続くコードがキャンセル要求自体の一部として実行されます。
Timer
以下のプログラムでは、トレースを追加すると、コールバックの実行が呼び出しでブロックcts.Cancel()
され、その呼び出しによってキャンセルされる待機中のタスクの後のコードが、cts.Cancel()
呼び出し自体と同じスレッドで実行されることがわかります。
以下のプログラムは、次のことを行っています。
- シミュレートする作業をキャンセルするためのキャンセル トークン ソースを作成します。
- 開始後に作業をキャンセルするために使用されるタイマーを作成します。
- タイマーをプログラムして、今から 100 ミリ秒後にオフにします。
- 上記の作業を開始し、200ms 間アイドリングします。
- タイマー コールバックが開始され、「作業」がキャンセルされ、
Task.Delay
500 ミリ秒スリープして、タイマーの破棄がこれを待機していることを示します。
- タイマー コールバックが開始され、「作業」がキャンセルされ、
- 期待どおりに作業がキャンセルされることを確認します。
- タイマーをクリーンアップし、この時点以降にタイマーが呼び出されないようにし、タイマーが既に実行されている場合は、完了するまでここでブロックします (タイマー コールバックが実行されている場合に適切に動作しない作業が後であったと仮定します)同時に)。
最初に書いたときに期待していたように、これを機能させる最も簡単な方法は、cts.CancelAfter(0)
代わりに を使用することですcts.Cancel()
。ドキュメントによると、cts.Cancel()
登録されたコールバックを同期的に実行します。この場合、async
/await
生成されたコードとの相互作用により、キャンセルが発生した時点以降のすべてのコードがその一部として実行されていると思います。cts.CancelAfter(0)
これらのコールバックの実行をそれ自体の実行から分離します。
誰もこれに遭遇したことがありますか?このような場合cts.CancelAfter(0)
、デッドロックを回避するための最良のオプションはありますか?
c# - ThrowIfCancellationRequested なしでタスクを停止する
キャンセルしたいタスクがあります。
これを行う通常の方法は、 を使用することCancellationToken
です。
しかし、現実の世界では、物事はそれほど単純ではありません。非同期コードはループできず、次のようになります。
オブジェクトとメソッド名に乱数を使用して、ループがまったく作成できないことを示しました。
最も厄介なのは、同じことを何度も書き続けなければならないことCancelToken.ThrowIfCancellationRequested()
です。
そして、それだけでは不十分であるかのCancellationToken
ように、Microsoft によると、適切なタイミングで実行時間の長い操作を停止できるようにするためだけに、コード全体をドラッグする必要があります。
そうは言っても、コードを汚染するこれらの繰り返しの呼び出しをなくす方法はありますか?
また、
メソッドに対してanOperationCancelledException
がスローされ、キャッチされWait
ます。CancelToken.ThrowIfCancellationRequested()
ただし、タスクによって実行される長い操作は、時々チェックがなければ停止しません。
待機のために例外がキャッチされたときに内部操作を停止させる方法はありますか?
c# - IIS で高負荷がかかっているサーバーでリクエストがキャンセルされる
の使用に関連していると思われる、再現が難しい問題に直面していますCancellationToken
。次の図に示すように、ASP.NET Web API を介して通信する 3 つの非同期アプリ (それぞれが異なるサーバー上) があります。
appは、 A
app への多数の同時要求を起動するルーチンを時々実行します。B
これにより、 app への別の多数の同時要求が起動されますC
。これらの呼び出しはすべて を使用して行われ、次のようHttpClient.SendAsync
に を使用して 10 秒のタイムアウトに制限されますCancellationToken
。
サーバーC
の負荷が高いと、応答に時間がかかり始めB
、タイムアウトが構成されているため、サーバーは要求のキャンセルを開始します。これが発生すると、リクエストが「スタック」することがあります(下の画像を参照)。
私は C# 非同期のベスト プラクティスに精通しており、そのようなことはしていませ.Result
ん.Wait()
。これらがハングを引き起こす可能性があることを認識しています。
代わりにパスCancellationToken.None
すると問題は解決するので、ヒントは、並行性の高いシナリオでのキャンセルに関係しているということです。
時間が経つにつれて、ますます多くの要求がハングし始め、最終的には IIS をリセットしてそれらをなくすしかありません。
何が起こっているのかの手がかりはありますか?
c# - .NET 4.0 でタイムアウトまたはキャンセルが要求されるまで「スリープ」する方法
一定の時間スリープするのに最適な方法は何IsCancellationRequested
ですかCancellationToken
?
.NET 4.0 で動作するソリューションを探しています。
書きたい
c# - タスク IsCanceled は false ですが、キャンセルしました
タスクをキャンセルすると、IsCanceled プロパティに対して await の結果が true を返します。何かがうまくいかないようです。
お知らせ下さい。これはコードです:
CancelButton を押して CancelButton_Click メソッドをトリガーすると、CallBack メソッドがトリガーされます。しかし... myTaskToWaitFor.IsCanceled を確認すると、常に false が返され、次の情報が表示されます: Id = 1、Status = RanToCompletion、Method = "{null}"。ステータスがキャンセルされていないのはなぜですか?
http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.throwifcancellationrequested.aspxを使用する場合
このような:
デバッグモードでエラーが発生するだけで、myTaskToWaitFor が実際にキャンセルされたように見えますが、コードは続行されません (続行すると、例外のためにプログラムがシャットダウンされます)。何かご意見は?敬具、
マティス
編集:
TrowIfCancellationRequested を使用したテストは、「キャンセルされた CancellationToken で ThrowIfCancellationRequested を呼び出すと、OperationCanceledException がスローされます。タスク並列ライブラリは、このタイプの例外が失敗ではなくキャンセルを表すことを認識しており、異なる方法で処理します。たとえば、 Task には、非同期メソッドの実行中に OperationCanceledException がスローされると自動的に true になる IsCanceled というプロパティがあります。
これが、myTaskToWaitFor.IsCancelled が true を返し、コードが続行されることを期待できると考えた理由です。