問題タブ [cancellation-token]
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# - TaskFactory.StartNewがCancellationTokenを受け取るのはなぜですか
重複の可能性:
タスクコンストラクターのキャンセルトークン:なぜですか?
このメソッドは、CancellationTokenを受け取ります。
キャンセルは協調的であるため(実際の作業コードはキャンセルトークンを監視する必要があります)、これを引数としてStartNewメソッドに渡す目的は何ですか?
c# - CancellationTokensはどのようにして最新であることが保証されますか?
Microsoftは、この.NET4での使用例CancellationToken
を示しています。
ただし、私の理解では、あるスレッドで変数が変更された場合、キャッシュが原因で別のスレッドが変更された値を取得しない可能性があります。またCancellationToken
、メインスレッドでキャンセルされるので、チェックしているスレッドが実際に最新で Task
あることをスレッドはどのように保証しますか?CancellationToken
Task
がトークンのキャッシュされた値を読み取ることができないのはなぜですか?
注:CancellationToken
これを尋ねる動機は、インスタンス変数がである必要があるかどうか疑問に思うことから生じますvolatile
。
.net - キャンセル トークンを使用した NetworkStream.ReadAsync は決してキャンセルされません
これが証拠です。
このコードの何が問題なのですか?
f# - Async.FromContinuations 宣言でキャンセル トークンを取得する
次の定義を検討してください
そのように計算を試したいとします
適切なキャンセル トークンを渡していないため、当然、内側のループは停止しません。Async.FromContinuations を通じて外部キャンセル トークンを取得する方法はありますか? async ビルダーと Async.CancellationToken を使用してこれを書き直すことはできますが、そうすると内部式に継続を渡すことができなくなります。
asp.net-mvc - キャンセル トークンを使用した MVC キャンセル タスク
http://msdn.microsoft.com/en-us/library/dd997396.aspxで説明されているように、キャンセル トークンを使用してタスクをキャンセルしたいと思います。
唯一の違いは次のとおりです。
特定のコントローラー/アクションを参照するときにタスクを開始し、現在の特定のアクション (ページ) から離れて参照するときに呼び出されるタスク (tokenSource.Cancel()) をキャンセルしたいと思います。どうすればいいですか?ありがとう
c# - スレッドの停止、ManualResetEvent、volatile boolean、cancellationToken
Windowsサービスにスレッド(STAThread)があり、大量の作業を実行します。Windowsサービスが再起動されたら、このスレッドを正常に停止したいと思います。
私はいくつかの方法を知っています
- 揮発性ブール
- ManualResetEvent
- CancellationToken
私がThread.Abortを見つけた限り、それはダメです...
ベストプラクティスは何ですか?作業はスレッドが開始されたクラスとは別のクラスで実行されるため、コンストラクターにcancellationTokenパラメーターを導入するか、たとえば揮発性変数を使用する必要があります。しかし、私は何が最も賢いのか理解できません。
更新
少し明確にするために、私が話していることの非常に簡単な例をまとめました。前に述べたように、これはWindowsサービスで実行されています。現在、ループまたはcancellationTokenでチェックされる揮発性ブール値を考えています。ループが終了するのを待つことはできません。以下に説明するように、数分かかる場合があり、サーバーのシステム管理者は次のように信じています。サービスを再起動する必要があるときに、サービスに問題があります。問題なくループ内のすべての作業を問題なくドロップできますが、スレッドではこれを実行できません。中止すると、「悪」であり、さらにCOMです。インターフェイスが呼び出されるため、小さなクリーンアップが必要です。
UPDATE
コードでisCancelled状態が「調べられた」cancellationTokenを使用してパフォーマンスを調べたところ、ManualResetEventSlimでwaitOneを使用するよりもはるかに高速です。いくつかの簡単な数字、forループで100.000.000回反復するcancellationTokenの場合は約 500ミリ秒、WaitOneの費用は約。3秒。したがって、このシナリオでのパフォーマンスは、cancellationTokenを使用する方が高速です。
.net-4.5 - 非同期リポジトリと CancellationToken
.NET 4.5 に移行しており、リポジトリに async を追加することを検討しています。
実装では、DB、WebServices などを呼び出す可能性があります。
私の質問は、CancellationToken をサポートする必要がありますか?
(心配しないでください - FindAllAsync() はおそらく Rx ベースになるでしょう :) )
.net - CancellationToken のポーリングが不可能な場合のキャンセルの提供
呼び出し元のスレッドをブロックするがキャンセルをサポートしないメソッドの (ばかげた) 例を次に示します。
最悪の場合、このメソッドを呼び出してから戻るまでに 17 時間かかります。このメソッドのソース コードにアクセスできないふりをします。CancellationToken を受け取るメソッドで呼び出しをラップするにはどうすればよいですか?
目標は、WorkUntil5()
キャンセルが要求されるまで実行することです。その時点で、コールは可能な手段を使用して終了する必要があります。
これが私が自分自身を思いつくことができる最良の方法です。タスクを使用しますが、それでも呼び出し元のスレッドをブロックします。それについて何かが正しく感じられません。mres.Set()
最初の呼び出しが返されたら、より良い呼び出し方法があるはずだと考えています。
c# - CancellationTokenUnRegisterアクション
私はさまざまなタスクのトークンを持っていますが、使用できるキャンセルの通知を受け取るには、それらのキャンセルをより適切に管理する必要があります。
この「サブスクリプション」を削除するにはどうすればよいですか?「登録解除」する方法はありますか?
TaskCompletionSourceで回避策を実行することを考えました。しかし、それがうまくいくかどうかはわかりません。このアプローチを解決するための最良の方法は何ですか?