問題タブ [cancellation]
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# - タスクを使用して長時間実行されている IO/ネットワーク操作をキャンセルするにはどうすればよいですか?
私は .net 4.0 のタスクとそのキャンセルを研究してきました。TPL が協力してキャンセルを正しく処理しようとしている点が気に入っています。
ただし、タスク内の呼び出しがブロックされて時間がかかる状況ではどうすればよいでしょうか? たとえば、IO/ネットワーク。
書き込みをキャンセルするのは明らかに危険です。しかし、それらは例です。
例: これをキャンセルするにはどうすればよいですか? DownloadFile
長い時間がかかることがあります。
c# - 観測可能なシーケンスをキャンセルする方法
IObservable<int>
私は500msごとにパルスジェネレータとして機能する非常にシンプルなものを持っています:
そして、私はCancellationTokenSource
(同時に進行している他の作業をキャンセルするために使用されます)を持っています。
キャンセルトークンソースを使用して、監視可能なシーケンスをキャンセルするにはどうすればよいですか?
c# - C# async CTP - TaskCanceledException をスローせずに非同期タスクをキャンセル済みとしてマークするにはどうすればよいですか?
開始後に頻繁にキャンセルする必要がある短い非同期タスクがあります。「タスク」クラスには IsCanceled インジケーターがあり、非同期タスクが実行を完了せずにキャンセルされたことを示すのに便利だと思いますが、非同期タスクをキャンセル済みとしてマークする唯一の方法は非同期関数で TaskCanceledException をスローします。例外なく発生する状況を示すために、日常的に例外をスローすることは、例外を使用する必要があると私が理解している方法に反します。非同期タスクが頻繁に発生すると予想される場合に、非同期タスクをキャンセルすることを示すより良い方法を知っている人はいますか?
私の次善の策は、独自の IsCanceled プロパティを持つ構造体を返すことです。
(ここでは簡潔にするために、いくつかの優れたコーディングとスタイルの実践を無視しています)
しかし、これは冗長で使いにくいようです。IsCanceled が 2 つ (Task に 1 つ、MightBeCanceled に 1 つ) あるため、一貫性の問題が発生することは言うまでもありません。
c# - ネストされたParallel.Forループ-Cancellation.Tokenが機能しない
次の問題があります。WPFアプリケーションのMainWindow.csのクリックイベントで開始する(意図的に)タイトなループがあります。
これで、別のボタンによってトリガーされた停止イベントにより、タイトループが停止し、タスクが終了するはずです。
私のタイトなループにはループがありますParallel.For
。アイデアは、一定量のことを同時に実行する必要があり(Parallel.For)、これを何度も繰り返す必要があるということです(タイトなループ)。これが最善のアプローチかどうかはわかりませんが、私が持っていたのはこれだけですが、機能します:)。
何もしないように見えるCancellation.Tokenに問題があります。ループを停止してタスクを正しく終了するにはどうすればよいですか。
これが私のコードです:
po.CancellationToken.IsCancellationRequested
私はそれを使って、または使わずに試しましたが、止まりませんでした。
更新:Damien_The_Unbelieverのおかげで解決策:
future - アクターを使用して非同期の相互依存のキャンセル可能な操作を実装する方法は?
私はアクター モデルにまったく慣れていないため、アクターやフューチャーなどの美しい構成可能な抽象化を使用して、私の一般的なシナリオに対処する確立されたパターンが既に存在すると思います。
次の要件を持つ非同期操作があります。
- 低レベルのリクエストを送信し、ポーリングでエンティティの状態を監視することで、レガシー システムを使用します。したがって、実際の操作の結果は延期された方法でのみ利用可能であり、監視された状態が目的の状態に達したときにリクエスターに通知する必要があります。
- これらの操作は、他のいくつかの操作が完了した後にのみ発行できます。これらの操作は、並行して待機する必要があります。
- 操作はキャンセルできます。もちろん、すでに発行された低レベルのリクエストは取り消すことができません。キャンセルとは、依存する操作が終了した後に実際の操作を発行しないことを意味します。もちろん、これは再帰的に伝播する必要があります (依存関係を待っていて、保留中の操作が複数ある場合は、それらを発行しないでください)。
私はFuturesで考えています:最初の要件は、たとえばAkkaのmap
/で解決でき、2番目の要件は、依存関係/依存関係を手続き的に維持することなくflatMap
、コンビネーターで解決できます。しかし、キャンセルtraverse
の解決策が思いつきません。フューチャーはキャンセルできず、構成されている場合、それらのコンポーネントには到達できません。「現在の操作のキャンセル」を機能的な方法でカプセル化する方法は? Scala の Actor フレームワークでこれをサポートしているものはありますか?
silverlight - 検証エラーが発生したときにSilverlightDataGridで編集をキャンセルするにはどうすればよいですか?
セルの編集中にDataGrid
検証エラーが発生しました(バインディングが例外をスローし、エラーがユーザーに正しく表示されます)。次に、ユーザーはどこかをクリックすることを選択し(アプリケーションの別の部分に移動するか、編集を終了する)、編集をキャンセルしたいと思います。ただし、アクティブな検証エラーがある場合、データグリッドは編集の終了を拒否します。つまり、ユーザーが有効な値を入力するか、エスケープキーを押すまで、グリッドアイテムを操作することはできません。
プログラムで編集を終了するにはどうすればよいですか、またはプログラムでエスケープキーを送信するか、プログラムで値のエントリを調整して値をリセットする以外に方法はありませんか?
c# - ThreadPool.QueueUserWorkItemタスクをキャンセルします
ThreadPool.QueueUserWorkItem(...)を使用して開始されたバックグラウンドタスクをキャンセルする必要があります。私はBackgroundWorkerが特にこの種のもののための構造を持っていることを知っていますが、ユーザーインターフェースが関与していないので、この場合はやり過ぎだと思います。キャンセルとは、単にコールバックメソッドの完了を強制することを意味します。
次のようなものをクラスに追加することの落とし穴は何ですか?
もっと良い方法はありますか?
c# - (クライアントによって開始されるのではなく) サーバー側で開始する必要がある長時間実行オペレーションをキャンセルする方法
オブジェクトの状態が変化する前にイベントを発生させ、状態が変化したらイベントを発生させるという規則に従って、キャンセル可能なイベントを公開するクラスがあります。パブリッシャー (サーバー) によって公開される変更前イベントはフォーム上にStateChanging
あり、引数として a を持ちますがCancelEventArgs
、変更後イベントはフォーム上にありStateChanged
ます。これにより、イベントのサブスクライバー (クライアント) は、開始前に操作をキャンセルすることができます。
現在、これらの操作の 1 つを長時間実行する操作に変更しました。サブスクライバーが操作の開始後も操作をキャンセルできるようにしたいと思います (また、操作の進行状況を知ることもできます)。イベントベースの非同期パターンまで考えました。
問題は、ある時点で操作を必要とするのはパブリッシャーであるため、変更前と変更後のイベントパターンを維持したいということですが、非同期パターンでは、特定の非同期に実行される操作。もう 1 つの可能性 (ただし、私には洗練されていないように思えます) はOperationRequired
、サーバー側で何を実行する必要があるかをクライアントが認識し、それに応じてRunOperationAsync()
メソッドを呼び出すことができるようにするイベント (例: ) をサーバーに公開させることです。コメントして提案を追加してください。
java - Java で ExecutorService をキャンセルする方法
を使用していくつかのスレッドを実行し、次のExecutorService
ように終了するまで待機するアプリケーションを作成しました。
時々、これらのスレッドの実行をキャンセルする必要があります (全体ExecutorService
)。
試してみましたが、スレッドexService.shutdownNow()
がスローjava.lang.InterruptedException
され、キャンセルされません。
これらのスレッドの実行をキャンセルするにはどうすればよいですか?
編集: nanda の要求として追加された T1 クラス コード