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

0 投票する
5 に答える
13033 参照

.net - default(CancellationToken) は CancellationToken.None と同等ですか?

の実装を見ると、CancellationToken.None単純に を返していdefault(CancellationToken)ます。CancellationTokenただし、のドキュメントには、2 つが同等であるという参照はありません。

私はこのような API を提供したいと思っていますが、それが常に機能することを確認するまでは提供しません。

default(CancellationToken)と同じ定義済みの動作CancellationToken.Noneですか、それとも実装の詳細だけですか?

0 投票する
8 に答える
3458 参照

c# - メソッドを醜くせずにキャンセル可能にする方法は?

私は現在、長期実行メソッドをキャンセル可能にするための改良を行っています。System.Threading.Tasks.CancellationToken を使用して実装する予定です。

私たちのメソッドは通常、いくつかの長時間実行されるステップを実行します (コマンドをハードウェアに送信してから、ほとんどの場合ハードウェアを待機します)。

キャンセルに関する私の最初の(おそらくばかげた)考えは、これを次のように変換します

率直に言って恐ろしく見えます。この「パターン」は、単一のステップ内でも続きます (そして、それらは必然的にすでにかなり長くなっています)。推奨されていないことはわかっていますが、これにより Thread.Abort() はかなりセクシーに見えます。

多くのボイラープレート コードの下にあるアプリケーション ロジックを隠さない、これを達成するためのよりクリーンなパターンはありますか?

編集

ステップの性質の例として、Runメソッドは次のように読むことができます。

連携するために同期する必要があるさまざまなハードウェア ユニットを制御しています。

0 投票する
0 に答える
186 参照

c# - 2 つの DLL でキャンセル トークンを共有する方法は?

FIRST dllに次のコードがあります。

メソッド クラスclassASECOND 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つにマージすることを正確に忘れていました。

ライブラリをマージしない場合、コードにエラーはありません。

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

c# - タスクでキャンセル トークンを送信する

async現在呼び出されているキャンセルできるようにしたいメソッドがあります

CancellationToken を渡してこのメ​​ソッドを呼び出すことができる構文を理解しようとしています。これが私がこれまでに試みたことです。

先に進む前に、メソッド内でキャンセルが要求されたかどうかを確認する予定です。ドキュメントに例が見つかりませんでした

私が持っているものはWebClientRetryAsyncメソッドへのトークンを取得しないため、これは機能しません。

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

asynchronous - f# async はいつ CancellationToken をチェックしますか?

私は楽しみと利益のために F# を読んでいます - 非同期プログラミングワークフローのキャンセルの下に、次の例があります。

これについて彼らは言う:

F# では、ネストされた非同期呼び出しはキャンセル トークンを自動的にチェックします。

この場合、それは次の行でした:

出力からわかるように、この行でキャンセルが発生しました。

ただし、私 (VS2010、F# 2.0、F# Interactive) の場合、次の出力が得られます。..afterトークンをキャンセルした後も印刷されることに注意してください。彼らは単に間違っていますか?

ということは、エントリー 時にキャンセルのチェックが行われるのではないAsync.Sleepでしょうか?いいえ、次のように出力されます。

したがって、チェックは実際には for ループにあるようです。つまり、キャンセルされた後、for ループまで実行し続けます。これが仕組みですか?睡眠後にチェックしたい場合はどうすればよいですか?

この質問は、上記のようにキャンセルが機能していることを示唆しているようです:キャンセルを明示的にチェックできますか/非同期計算を終了できますか?

編集: これが FSI 2.0 のみであるかどうかについて: 次のループで何が起こるか、それぞれ 200ms、2500ms、4000ms スリープすると? 真ん中に印刷されますか?

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

c# - CancellationTokenRegistration が存在する理由と IDisposable を実装する理由

結果に句を使用Cancellation.Registerするコードを見てきました:usingCancellationTokenRegistration

であることを確認する必要があると思いますDisposeIDisposable、なぜ実装しているのIDisposableでしょうか。どのリソースを解放する必要がありますか? それが持っている唯一の方法は平等です。

あなたがそれをしないDisposeとどうなりますか?あなたは何を漏らしますか?

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

c# - Async network operations never finish

I have several asynchronous network operations that return a task that may never finish:

  1. UdpClient.ReceiveAsync doesn't accept a CancellationToken
  2. TcpClient.GetStream returns a NetworkStream that doesn't respect the CancellationToken on Stream.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?

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

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

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

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

止まらないのはなぜ?

編集1: