問題タブ [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# - CancellationToken で StreamReader.ReadLineAsync をキャンセルできますか?
Cancel()
my のメソッドを呼び出して次のコンテンツで非同期メソッドをキャンセルすると、CancellationTokenSource
最終的に停止します。ただし、行Console.WriteLine(await reader.ReadLineAsync());
が完了するまでにかなりの時間がかかるため、呼び出しに対するメソッドの応答性を高めるために、(空の文字列が返されることを期待して) to もCancellationToken
渡そうとしました。ただし、 to を渡すことができませんでした。ReadLineAsync()
Cancel()
CancellationToken
ReadLineAsync()
Console.WriteLine()
orへの通話をキャンセルできますか? キャンセルできるStreamreader.ReadLineAsync()
場合、どうすればよいですか?
ReadLineAsync()
が受け入れないのはなぜCancellationToken
ですか? CancellationToken
メソッドがキャンセルされた後も完了する場合でも、非同期メソッドにオプションのパラメーターを与えることをお勧めします。
更新: 以下のコメントに記載されているように、Console.WriteLine()
1 行あたり 40.000 文字の不適切な形式の入力文字列が原因で、呼び出しだけですでに数秒かかっていました。これを分解すると応答時間の問題は解決しますが、何らかの理由で 40.000 文字を 1 行に書き込むことが意図されていた場合 (たとえば、文字列全体をファイル)。
c# - default(CancellationToken) に対応する CancellationTokenSource を設定するにはどうすればよいですか
デフォルトを作成すると、プライベートフィールドに保存されている が関連付けられていることCancellationToken
がデバッガで確認できます。CancellationToken
CancellationTokenSource
m_source
構造体に関しては、default
キーワードが「値型か参照型かに応じて、構造体の各メンバーをゼロまたはヌルに初期化して返す」ことがどのようになるのか疑問に思っていますCancellationTokenSource
。
CancellationToken
このフィールドを設定する 2 つのコンストラクターがありますが、コンストラクターを呼び出さず、 (まったく同じ動作をする) 構造体がパラメーターなしのコンストラクターを持つことができないため (まだdefault(CancellationToken)
) コンストラクターを呼び出さないため、これらは無関係です。new CancellationToken()
c# - キャンセルトークンのリンク
サービスを正常にシャットダウンできるように、渡されるキャンセル トークンを使用します。サービスには、他のサービスへの接続を試行し続けるロジックがあるため、トークンは、個別のスレッドで実行されているこれらの再試行ループから抜け出すための優れた方法です。私の問題は、内部再試行ロジックを持つサービスを呼び出す必要があるが、再試行が失敗した場合は一定期間後に戻る必要があることです。これを行うタイムアウト付きの新しいキャンセルトークンを作成したいと思います。これに関する問題は、新しいトークンが「マスター」トークンにリンクされていないため、マスター トークンがキャンセルされた場合、新しいトークンはタイムアウトするか、接続が確立されて戻るまで有効です。私がやりたいのは、2 つのトークンをリンクして、マスター トークンがキャンセルされると新しいトークンもキャンセルされるようにすることです。使ってみたCancellationTokenSource.CreateLinkedTokenSource
メソッドですが、新しいトークンがタイムアウトすると、マスター トークンもキャンセルされます。トークンを使用して必要なことを行う方法はありますか、または再試行ロジックを変更する必要がありますか (おそらくこれを簡単に行うことはできません)
これが私がやりたいことです:
マスター トークン – サービスが正常にシャットダウンできるように、さまざまな関数を渡します。一時トークン – 単一の関数に渡され、1 分後にタイムアウトに設定されます
マスタートークンがキャンセルされた場合、一時トークンもキャンセルする必要があります。
一時トークンの有効期限が切れた場合、マスター トークンをキャンセルしてはなりません。
c# - タスク実行デリゲート内でキャンセルのサポートを遅らせる適切な方法は何ですか?
これを達成する方法について、MSDN にもここにも具体的な言及はありません。ユースケースはややあいまいですが、それでも有効だと思います。
上記のコードは、切り離された子遅延タスクtask
を含むを 100 ミリ秒後にキャンセルしようとし、 (キャンセルにより)が生成されるのを待ちます。これに関する問題は、キャンセルではなくフォルトになることです。両方が同じキャンセル トークンを共有しているにもかかわらず、遅延タスクが親にアタッチされていないため、これは予想される動作です。task
AggregateException
task
task
私の質問は、特に、Task.Delay
既に実行されているタスクに a をアタッチする方法に関連しています。親タスクにアクセスできる場合でも、これを行うことは可能ですか? それが不可能な場合、または親タスク インスタンスにアクセスできない場合、このシナリオを処理する適切な方法は何ですか?
私が思いついた最善の回避策は、遅延タスクWait
を try/finally ブロックでラップし、タスクのキャンセルを明示的にバブルアップしようとすることでした。
効果的ではありますが、あまり正しくはありませんが、これを達成するためのより良い方法があるかどうかはわかりません. 望ましい結果は、キャンセルが発生した場合Canceled
ではなく、親タスクが移動することです。Faulted
そのため、切り離された子タスクでキャンセルの発生が発生した場合でも、親タスクは に移行する必要がありCanceled
ます。
注:問題や結果が変わらないように見えるという理由だけで、ここでは意図的に async/await を省略しました。そうでない場合は、例を示してください。
c# - 完了したスレッドが条件を満たすとすぐに他のスレッドをキャンセルする方法
3 つのリモート API サーバーに何かが存在するかどうかを確認する必要がある ASP.NET MVC アプリケーションがあります。アプリケーションは ID を各 API に渡し、true または false を返します。コードは次のようになります。
このコードは現在、3 つの API すべてを非同期的にチェックしていますが、すべての HttpClient 呼び出しが完了するまで待機してから、MVC アクションが返されます。
1 つの API が true を返すとすぐに、他のタスクが完了するのを待つのではなく、Action ですぐに true を返したいと考えています。
C# Task クラスには .WaitAll と .WaitAny がありますが、これらも機能しません。他の HttpClient リクエストをキャンセルする必要があるため、CancellationToken を使用する必要があると思いますが、この構造で使用する方法がわかりません。
乾杯。
c# - Escape キーで並列非同期 IO タスクを適切にキャンセルする方法は?
私は非同期待機操作を学んでおり、非常に役立つ記事を見つけました。
この記事の最後のコード スニペットを検討します。
タスクをキャンセルするコードをいくつか試しましたが、私見ですが、これらは非常に醜い試みです。この試みでは、プログラムフローはユーザーがキーを押すのを待ちますが、イベントのように、ユーザーが Esc ボタンを押すまでこのコードを機能させたいと思います:
Escape キーで適切にキャンセルするにはどうすればよいですか?
アップデート:
このコードを挿入しました:
ただし、このコードは method をキャンセルしませんProcessWriteMult(cts)
。私は何を間違っていますか?