問題タブ [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.
.net - default(CancellationToken) は CancellationToken.None と同等ですか?
の実装を見ると、CancellationToken.None
単純に を返していdefault(CancellationToken)
ます。CancellationToken
ただし、のドキュメントには、2 つが同等であるという参照はありません。
私はこのような API を提供したいと思っていますが、それが常に機能することを確認するまでは提供しません。
default(CancellationToken)
と同じ定義済みの動作CancellationToken.None
ですか、それとも実装の詳細だけですか?
c# - メソッドを醜くせずにキャンセル可能にする方法は?
私は現在、長期実行メソッドをキャンセル可能にするための改良を行っています。System.Threading.Tasks.CancellationToken を使用して実装する予定です。
私たちのメソッドは通常、いくつかの長時間実行されるステップを実行します (コマンドをハードウェアに送信してから、ほとんどの場合ハードウェアを待機します)。
キャンセルに関する私の最初の(おそらくばかげた)考えは、これを次のように変換します
率直に言って恐ろしく見えます。この「パターン」は、単一のステップ内でも続きます (そして、それらは必然的にすでにかなり長くなっています)。推奨されていないことはわかっていますが、これにより Thread.Abort() はかなりセクシーに見えます。
多くのボイラープレート コードの下にあるアプリケーション ロジックを隠さない、これを達成するためのよりクリーンなパターンはありますか?
編集
ステップの性質の例として、Run
メソッドは次のように読むことができます。
連携するために同期する必要があるさまざまなハードウェア ユニットを制御しています。
c# - 2 つの DLL でキャンセル トークンを共有する方法は?
FIRST dllに次のコードがあります。
メソッド クラスclassA
はSECOND dllにあります。
次に、メソッド FuncAsync がコンソール アプリケーションで呼び出されます。
最初の DLL には 2 番目の DLL が含まれ、コンソール アプリケーションには最初の DLL が含まれます。
このコードは正常にコンパイルされ、警告もエラーもありません。しかし、実行時に次の行でエラーが発生します: Save(a, b, ct);
Additional information: Could not load type 'ProgressHandler' from assembly 'A.B.C, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because the method 'func' has no implementation (no RVA).
コードから CancellationToken を削除すると、すべて問題ありません。
CancellationToken を Application から DLL1 に送信し、次に DLL1 から DLL2 に送信するにはどうすればよいですか?
編集 :
コマンドのみを使用して、2つのDLLを1つにマージすることを正確に忘れていました。
ライブラリをマージしない場合、コードにエラーはありません。
c# - タスクでキャンセル トークンを送信する
async
現在呼び出されているキャンセルできるようにしたいメソッドがあります
CancellationToken を渡してこのメソッドを呼び出すことができる構文を理解しようとしています。これが私がこれまでに試みたことです。
先に進む前に、メソッド内でキャンセルが要求されたかどうかを確認する予定です。ドキュメントに例が見つかりませんでした
私が持っているものはWebClientRetryAsync
メソッドへのトークンを取得しないため、これは機能しません。
asynchronous - f# async はいつ CancellationToken をチェックしますか?
私は楽しみと利益のために F# を読んでいます - 非同期プログラミング。ワークフローのキャンセルの下に、次の例があります。
これについて彼らは言う:
F# では、ネストされた非同期呼び出しはキャンセル トークンを自動的にチェックします。
この場合、それは次の行でした:
出力からわかるように、この行でキャンセルが発生しました。
ただし、私 (VS2010、F# 2.0、F# Interactive) の場合、次の出力が得られます。..after
トークンをキャンセルした後も印刷されることに注意してください。彼らは単に間違っていますか?
ということは、エントリー 時にキャンセルのチェックが行われるのではないAsync.Sleep
でしょうか?いいえ、次のように出力されます。
したがって、チェックは実際には for ループにあるようです。つまり、キャンセルされた後、for ループまで実行し続けます。これが仕組みですか?睡眠後にチェックしたい場合はどうすればよいですか?
この質問は、上記のようにキャンセルが機能していることを示唆しているようです:キャンセルを明示的にチェックできますか/非同期計算を終了できますか?
編集: これが FSI 2.0 のみであるかどうかについて: 次のループで何が起こるか、それぞれ 200ms、2500ms、4000ms スリープすると? 真ん中に印刷されますか?
c# - CancellationTokenRegistration が存在する理由と IDisposable を実装する理由
結果に句を使用Cancellation.Register
するコードを見てきました:using
CancellationTokenRegistration
であることを確認する必要があると思いますDispose
がIDisposable
、なぜ実装しているのIDisposable
でしょうか。どのリソースを解放する必要がありますか? それが持っている唯一の方法は平等です。
あなたがそれをしないDispose
とどうなりますか?あなたは何を漏らしますか?
c# - Async network operations never finish
I have several asynchronous network operations that return a task that may never finish:
UdpClient.ReceiveAsync
doesn't accept aCancellationToken
TcpClient.GetStream
returns aNetworkStream
that doesn't respect theCancellationToken
onStream.ReadAsync
(checking for cancellation only at the start of the operation)
Both wait for a message that may never come (because of packet loss or no response for example). That means I have phantom tasks that never complete, continuations that will never run and used sockets on hold. I know i can use TimeoutAfter
, but that will only fix the continuation problem.
So what am I supposed to do?
c# - キャンセル トークンとスレッドが機能しない
スレッドをキャンセルして、直後に別のスレッドを実行したい。これが私のコードです:
このメソッドを呼び出すと、最初のスレッドは停止せず、2 番目のスレッドが実行を開始します...
しかし、最後の 2 行をスキップすると動作します:
止まらないのはなぜ?
編集1: