問題タブ [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.

0 投票する
3 に答える
2175 参照

c# - 非同期操作を正しくキャンセルし、再度起動する

ユーザーが長時間実行される非同期操作を呼び出すボタンを複数回押す可能性がある場合の処理​​方法。

私の考えは、最初に非同期操作が実行されているかどうかを確認し、キャンセルして再度起動することでした。

これまでのところ、CancellationTokenSource を使用してこの種の機能を構築しようとしましたが、期待どおりに機能していません。2 つの非同期操作が実行されている場合があるため、新しい非同期操作を開始しても「古い」非同期操作はまだキャンセルされず、resul 処理が混同されます。

この種のケースを処理する方法の提案や例はありますか?

編集: 最後に、2 つの非同期操作が短時間で実行されていることは悪くないと思います (新しい操作が実行され、古い操作がまだキャンセルされていない場合)。

ここでの本当の問題は、エンドユーザーに進行状況を表示する方法です。古い非同期操作が終了すると、進行状況インジケーターがエンドユーザーから隠されますが、新しく開始された非同期操作はまだ実行されています。

EDIT2: DrawContent(...) 内部では、ThrowIfCancellationRequested を使用しているため、実行中のタスクをキャンセルしても問題ないようです。

進捗表示について。Draw() が呼び出されると、ロード インジケーターが表示されるように設定し、このメソッドが終了すると、ロード インジケーターを非表示にします。そのため、新しい非同期操作を開始した後に前の非同期操作がキャンセルされると、読み込みインジケーターが非表示に設定されます。「古い」メソッドが終了したときに別の非同期メソッドがまだ実行されているかどうかを追跡するにはどうすればよいですか。

0 投票する
1 に答える
2464 参照

c# - C# から C++/CX で非同期操作をキャンセルする方法

C++/CX で記述された操作を C# からキャンセルしようとしています。両方のコードを書いたにもかかわらず、C# 側から操作を待機しているときに操作を適切にキャンセルすることができません。次に例を示します。

C# から:

C++ から:

問題は、トークンを AsTask 拡張メソッドに渡すと、ABI を介してタスクを呼び出すときに何も行われないことです。C++ 側をデバッグすると、ct と is_task_cancellation_requested() 関数の両方がキャンセルが要求されていないことを示します。

0 投票する
3 に答える
1548 参照

c# - TPL Dataflow を使用して、すべての投稿をキャンセルしてから 1 つ追加できますか?

TPL Dataflow ライブラリを使用して、次のようなことをしたいと思います。

ActionBlock のキャンセル トークンがすべてをキャンセルしているようです。それを設定した場合、新しい ActionBlock を作成する必要があります。ActionBlock で部分的なキャンセルを行うことはできますか?

まだ処理されていない投稿は試行しないでください。現在実行中の投稿をチェックインできるキャンセル トークンがあればいいのですが。

0 投票する
1 に答える
3809 参照

c# - キャンセル トークンとスレッドが機能しない

スレッドをキャンセルして、直後に別のスレッドを実行したい。これが私のコードです:

このメソッドを呼び出すと、最初のスレッドは停止せず、2 番目のスレッドが実行を開始します...
しかし、最後の 2 行をスキップすると動作します:

止まらないのはなぜ?

編集1:

0 投票する
3 に答える
8982 参照

c# - CancellationTokenSource.Cancel が例外をスローしています

ドキュメント CancellationTokenSource.Cancel を読んだとき、例外をスローすることは想定されていません。
CancellationTokenSource.Cancel

cts.Cancel(); の呼び出しの下 OperationCanceledException を引き起こしている (スローしていない)。
その行をコメントアウトしたかのように、最後の OperationCanceledException がスローされないことを非常に確信しています。

cts.Cancel 行がアクティブな場合、例外をスローしている行は t2.Wait(token); です。
cts.Cancel(); に遅延がある場合 次に t2.Wait(トークン); 行が呼び出されるとすぐに例外をスローしません。
t2.Wait(トークン); cts.Cancel() が実行されたときにのみその例外をスローします。
それは適切な行動ですか?
一貫性がある場合は、それで問題ありませんが、cts.Cancel で例外が発生することは望ましくありません。
私は明らかに混乱しています。動作を理解したいだけなので、これを本番環境に快適に持ち込むことができます。
現在、BackGroundWorker を使用してこれを行っており、wait と cancel を使用して簡単に追跡および維持できると考えました。

if (token.IsCancellationRequested || ctr == 100000000)
まだ ctr == 100000000
でスローする

このコードに何か問題がありますか?
それとも、それがどのように機能するはずですか?

Task t2 = Task.Run に try catch がないと、キャッチされない例外がスローされました。
t2 の try catch でキャッチされると思っていましたが、一度に 1 つずつ質問してください。

これは .NET 4.5 のコンソール アプリです。

0 投票する
2 に答える
5167 参照

c# - ThrowIfCancellationRequested は例外をスローしていないようです

私は次のコードを持っています:

listはいくつかの要素が含まれています。「c」を押すと、すべてのComputeメソッドがすでに開始されています。

「c」を押しても、例外はスローされません。各Computeメソッドは、通常の終了まで実行を続けます。

Compute「c」を押すと、残りのすべてのメソッドを停止/強制終了したいと思います。

0 投票する
1 に答える
2182 参照

c# - タスクがタイムアウトまたは手動トリガーによってキャンセルされたかどうかを知るにはどうすればよいですか?

次の Start および Cancel イベント ハンドラがあるとします。キャンセルのトリガーとなった人物を特定するにはどうすればよいですか?