問題タブ [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# - 継続して TPL タスクを正しくキャンセルする方法
TPL を使用してバックグラウンド スレッドに配置している長時間実行操作があります。私が現在持っているものは機能していますがAggregateException、キャンセルリクエスト中にどこで処理する必要があるかについて混乱しています.
ボタンクリックイベントで、プロセスを開始します。
DuplicateSqlProcsFrom(CancellationToken _token, SqlConnection masterConn, string _strDatabaseA, string _strDatabaseB, bool _bCopyStoredProcs = true, bool _bCopyFuncs = true)私が持っている方法では
ボタン Click イベントで (またはdelegate(buttonCancel.Click += delegate { / Cancel the Task / } ) I cancel theTask` を次のように使用して):
OperationCanceledExceptionこれはメソッドの罰金をキャッチし、私のメッセージを出力しますが、上記DuplicateSqlProcsFromによって提供されるコールバックでは、常に; です。キャンセルするべきです!asyncDupSqlProcs.ContinueWith(task => { ... });task.StatusRanToCompletion
Cancel()この場合、タスクをキャプチャして処理する正しい方法は何ですか。CodeProject のこの例と MSDNの例に示されている単純なケースでこれがどのように行われるかは知っていますが、この場合、継続を実行するときに混乱します。
この場合、キャンセル タスクをキャプチャするにはどうすればよいですか? また、タスクtask.Statusが適切に処理されるようにするにはどうすればよいですか?
android - Android Speex エコー キャンセルの問題
基本的な audiorecord-audiotrack、udp パケットの音声チャットを 2 つの Android デバイス間で使用しています。動作しますが、エコーが悪いです。JNIによってAndroidに移植されたSpeexを使用してエコーを削除しようとしています。インポートした Speex は機能しますが、エコー キャンセレーションは機能しません。ネイティブ C コードは次のとおりです。
そして、いくつかの重要な Java コード:
問題は、レコーダー/ストリーミング スレッドを開始すると、1 つのパッケージが送信されたことが示され、アプリがメッセージなしでクラッシュすることです。提案やアドバイスはありますか?私はこのプロジェクトをできるだけ早く行う必要があり、一生懸命働いて自分自身を文書化しましたが、それでもうまくいきたくないので、助けてください。ありがとうございました!
編集:私はちょうどそれを発見しました
クラッシュを引き起こしています。
c# - AggregateException の TaskCanceledException にスタック トレースが含まれていない
Task Parallel Library を使用してタスクを実行しています。タスクをキャンセルすると、OperationCanceledException がスローされ、次のように AggregateException を使用してキャッチされます。AggregateException には、スローされた例外に対応する TaskCanceledExceptions のリストが含まれています。残念ながら、これらの TaskCanceledExceptions は、元の例外によってスローされたスタック トレースを失っているようです。これは設計によるものですか?
結果:
c# - TPLを使用したマルチスレッドのクラス間キャンセル
すべて、タスクパラレルライブラリ(TPL)を使用してバックグラウンドスレッド(キャンセルサポート付き)で実行する長時間実行プロセスがあります。この長時間実行されるタックのコードはClass Validation、メソッド内に含まれています。
から実行されますClass Validation私はプロセスを正常にキャンセルすることができます。キャンセルリクエストは適切なものdelegate(以下に表示)によって処理され、これは正常に機能します(これが私の問題の原因であるとは思わない)。
このメソッドを別のクラスから実行する場合Class Batch、「コントローラー」メソッドを介してこれを実行します
次にメソッドを呼び出します
valFormへのアクセサはどこにありますかClass Validation、メソッドは正常に実行されますが、キャンセルを試みると、delegate
どこ
でフリーズ/ハングします(未処理の例外などはありません)_task.Wait()。これ(私は信じています-テストを通して)は、私がキャンセルしているという事実と関係があります。これは、asyncControlMethod()を呼び出しvalForm.AsyncRunValidationProcess(...)たのでasyncControlMethod()、現在のプロセスがハングする原因となっているキャンセルです。CancellationTokenSource問題は、子メソッドに渡すなどにあるようです。イベントが発生して制御メソッドが強制終了されIsCancellationPending、子メソッドがハングします。
誰かが私が間違っていることを教えてもらえますか、または(より適切には)そのようなキャンセル手続きを許可するために私は何をすべきですか?
注:子タスクを生成して実行しようとしvalForm.AsyncRunValidationProcess(...)ましCancellationTokenたが、これは機能しませんでした。
御時間ありがとうございます。
c# - C# で共有 Task:s のキャンセルを実装する方法
すべて、C# で Task:s をキャンセルする複雑なケースの設計/ベスト プラクティスに関する質問です。共有タスクのキャンセルをどのように実装しますか?
最小限の例として、次のことを想定してみましょう。長時間実行され、協調的にキャンセル可能な操作「Work」があります。キャンセル トークンを引数として受け取り、キャンセルされた場合はスローします。一部のアプリケーションの状態で動作し、値を返します。その結果は、2 つの UI コンポーネントによって個別に必要とされます。
アプリケーションの状態が変更されていない間は、Work 関数の値をキャッシュする必要があります。1 つの計算が進行中の場合、新しい要求は 2 番目の計算を開始するのではなく、結果の待機を開始する必要があります。
どちらの UI コンポーネントも、他の UI コンポーネント タスクに影響を与えることなく、そのタスクをキャンセルできる必要があります。
ここまで一緒ですか?
上記は、実際の Work タスクを TaskCompletionSources にラップする Task キャッシュを導入することで実現できます。その Task:s は UI コンポーネントに返されます。UI コンポーネントがそのタスクをキャンセルすると、TaskCompletionSource タスクのみが破棄され、基になるタスクは破棄されません。これはすべて良いです。UI コンポーネントは CancellationSource を作成し、キャンセル要求は通常のトップダウン設計であり、下部に連携する TaskCompletionSource タスクがあります。
さて、本当の問題に。アプリケーションの状態が変化した場合の対処方法 'Work' 関数を状態のコピーで動作させることは実現不可能であると仮定しましょう。
1 つの解決策は、タスク キャッシュ (またはそのあたり) の状態の変化をリッスンすることです。基になるタスク (Work 関数を実行するタスク) によって使用される CancellationToken がキャッシュにある場合、それをキャンセルできます。これにより、アタッチされたすべての TaskCompletionSources Task:s のキャンセルがトリガーされる可能性があり、したがって、両方の UI コンポーネントが Canceled タスクを取得します。これはある種のボトムアップキャンセルです。
これを行うための好ましい方法はありますか?どこかにそれを説明するデザインパターンはありますか?
ボトムアップキャンセルは実装できますが、ちょっと変な感じです。UI タスクは CancellationToken で作成されますが、別の (内部の) CancellationToken によりキャンセルされます。また、トークンが同じではないため、UI で OperationCancelledException を無視することはできません。これにより、(最終的に) 外側の Task:s ファイナライザーで例外がスローされます。
c++ - WIN32ソケットAPI:イベントベースの完了通知を使用したソケットでの送信/受信のキャンセル
オーバーラップ操作でソケットを使用して、イベントベースの完了通知を選択しました。2つのイベントがあります。1つはデータ用で、もう1つは長い送信/受信をキャンセルするためのものです。
次に、WSASendを呼び出します。
に続く
これは、通知された任意の1つのイベントに戻るように設定されています。ここで、送信が進行中であり、m_hInterruptEventが通知されたと仮定します。WSAWaitForMultipleEventsが戻ります。技術的には、sendを呼び出す関数も戻り、内部で割り当てられたバッファーを削除できます。
私にはわかりませんが、WSASendはまだバックグラウンドで動作している可能性があり、バッファを削除すると、最良の場合、データが破損します。
ソケットを他の何かにすぐに使用する必要がある場合、バックグラウンドの送信/受信を停止する適切な方法は何でしょうか?
CancelIO()を見ましたが、MSDNはSocketsに関連して言及していません。ファイルベースのIOでのみ機能しますか?
c - C プログラムの Linux POSIX がキャンセル スレッドで失敗する
異なるスレッドでデータの一部を読み取り、その中のパターンを見つけるプログラムを書いています。
しかし、その前に (問題は以下のコードで発生します)、スレッドが適切にキャンセルされるかどうかを確認したかっただけです。それが私が立ち往生しているところです。エラーが表示されるまでに時間がかかりますが、基本的にプログラムを開始した後 (40 回の場合もあります)、メイン スレッドの while ループでハングします。
... 最後のスレッドがキャンセルされるのを待っています。
コードはこちら: http://pastebin.com/VqRrhXPD
私が読んでいるファイルのコンテンツも提供しました。
オープニング:
c++ - pthread_exitが省略記号によってキャッチされたものをスローするのはなぜですか?
によって呼び出される関数pthread_createが次の構造を持つ場合
省略記号の例外ハンドラーが実行時に呼び出されるのはなぜpthread_exitですか?std::exception(たとえば、スローされないことに注意してください)
javascript - jQueryの遅延をキャンセルできますか?
据え置きをキャンセルしたい状況があります。deferred は ajax 呼び出しに関連付けられています。
deferred を使用する理由
$.ajax によって返される通常の xhr オブジェクトは使用しません。私は jsonp を使用しています。つまり、エラー処理に HTTP ステータス コードを使用できず、それらを応答に埋め込む必要があります。その後、コードが検査され、関連付けられた遅延オブジェクトが解決済みまたは拒否済みとしてマークされます。これを行うカスタム API 関数があります。
延期をキャンセルしたい理由
リストのフィルターとして機能する入力フィールドがあり、入力が終了してから 0.5 秒後にリストが自動的に更新されます。一度に 2 つの ajax 呼び出しが未処理になる可能性があるため、前の呼び出しをキャンセルして、2 回目以降に返されず、古いデータが表示されないようにする必要があります。
気に入らない解決策
- で添付されたハンドラが起動するため、遅延を拒否したくありません
.fail()。 - ajaxが戻ったときに自動的に解決済みまたは拒否済みとしてマークされるため、無視できません。
- 遅延オブジェクトを削除すると、ajax 呼び出しが戻り、遅延オブジェクトを解決済みまたは拒否済みとしてマークしようとすると、エラーが発生します。
私は何をすべきか?
遅延をキャンセルしたり、添付されたハンドラーを削除したりする方法はありますか?
設計を修正する方法についてのアドバイスは大歓迎ですが、ハンドラーを削除する方法や、ハンドラーが起動しないようにする方法を見つけることが優先されます。
c# - タスク内でWebサービスリクエストをキャンセルし、キャンセルが発生したときにいくつかのことを行う方法
ツリーがあり、ユーザーが任意のノードをクリックすると、Web サービスからデータを照会し、結果を置き換えます。ただし、時間がかかる場合もあります。そこで、Web サービス呼び出しをタスクにラップしようとしました。タスクが完了していないときにタスクをキャンセルし、ユーザーが他のノードをクリックしたいと思います。以下は私のサンプルコードです。ただし、_cancelTokenSource.Cancel() が実行されても、キャンセル タスク ブロックは実行できません。MSDN が提供するサンプルのほとんどは、I/O バウンドではなく、CPU バウンドに基づいています。Webサービスをすべてキャンセルする方法を誰か教えてもらえますか? 前もって感謝します
}