問題タブ [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.
android - キャンセルをサポートする Android ファイル アップロード キュー
複数の写真をサーバーに非同期でアップロードする必要がある Android アプリケーションを開発しています。写真が撮られるとすぐに、アップロードが開始されると考えてください。アップロードが完了するとすぐに、次のもの (すべてがキューに入れられます) のアップロードが開始されます。
ただし、キャンセル機能をサポートすることも重要です。つまり、ユーザーはキューから画像を削除したり、実行中のアップロードをキャンセルしたりする方法でアプリを操作できます。
考えられる解決策を探した結果、次のシナリオが考えられます。
1) キュー メカニズムに IntentService を使用し、その内部に独自のロジックを実装します。ただ、キャンセル対応がどれだけ簡単になるのか、不安もあります。
2) SD カードとローカル データベースを使用してファイルを保存し、サービスを使用して新しいファイルをチェックします。これについては、 Android (または iOS) - 画像アップロード キューで説明しています。
3) 組み込みの Android DownloadManager をアップロードに使用する方法を見つけます (本当にできるのでしょうか?)。
4) AsyncTask と isCancelled() 関数を使用します。
5) または理想的には、上記のすべてをシームレスな方法で実行する別の組み込みの Android/Java メカニズムを見つけます。
何か案は?
task - CancellationToken.IsCancellationRequestedなしでタスクをキャンセルするには?
私は C# 4.0 を使用して WPF アプリケーションを開発しています。このアプリケーションでは、ユーザー固有のコードが実行時にコンパイルされ、AppDomain 内で実行されます。このプロセスには 10 ミリ秒または 5 分かかる場合があります。AppDomain はTask.Factory.StartNew()によって作成されます。正常に動作します。
今、実行をキャンセル/中断できるようにしたいと考えています。コードの実行中に停止ボタンを押すことはできますが、タスクをキャンセルするにはどうすればよいですか? 私は知っています: CancellationToken.IsCancellationRequestedプロパティがありますが、何かをループすることはできません。これが、(アトミック) コードの実行中に値を確認できない理由です。また、AppDomain をアンロードしてもタスクは停止しません。
参考までに、使いやすいという理由でTaskクラスを使用しました。Threadが役立つ場合: 問題ありません。
誰かが私を助けることができますか?短いコード スニペットがいいでしょう :)。
ありがとうございました。
ruby-on-rails - Railsキャンセル確認理由
通話を含むアプリケーションがあります。通話をキャンセルし、通話キャンセルの理由を提供できるようにしたいです。これまでのところ、コントローラーでキャンセルアクションが機能していますが、フィールドに「キャンセル」を投稿する前に、ドロップダウンに基づいてフィールドにcall_status
もデータを入力するように、それを拡張する方法を見つけようとしています。cancel_reason
これが私がこれまでに持っているものです:
ビュー コード: キャンセル ボタン
コントローラ コード:アクションのキャンセル
キャンセルの理由とともに表示される確認ポップアップ、または理由を含む小さなフォームで別のビューに関連付けられたキャンセル アクションのいずれかが必要です。
.net - 非即時タスクのキャンセル、再起動、およびビジーインジケーター
ボタンのクリックから起動されるバックグラウンド非同期タスクがあります。IsBusy
タスクの開始時に更新され、キャンセルまたは完了を説明するためにfinallyブロック内にあるプロパティがあります。
現在、ボタンクリックイベントは前のタスクをキャンセルし、再度クリックすると新しいタスクを開始します。ただし、最初のタスクのキャンセルは新しいタスクの開始後も長引く可能性があるため、ブールIsBusy
インジケーターが同期しなくなる可能性があります。
私の問題は、この状況にどう対処するかです。
私の現在の解決策は、ブール値を直接更新するのではなく、開始時と完了時にインクリメント/デクリメントされる整数を使用することです-IsBusy
プロパティはを返しBusyCount > 0
ます。ただし、これにはスレッドセーフのための追加が必要であり、良い解決策とは思えません。
もう1つの考えは、タスクが実行されたときにタスクを保存し、最初のタスクの続きとしてのみ新しいタスクを開始することでした。これはキャンセルの問題を説明しますが、タスクではなく呼び出し元に不必要な遅延(ただし部分的)と「契約」を強制します。
私の最終的な考えは、スレッドセーフなコレクションに追加/削除される使い捨てのBusyTokenを配布するBusyTokenSourceクラスのようなものを作成することでした。しかし、これはやり過ぎのようです。
このタイプの状況を処理するためのより良い/適切な/一般的な方法はありますか?
編集:
私は上記の最後の考えに行き着き、「BusyToken」クラスを作成しました。このようにして、関数をaでラップしusing(BusyTokenSource.GetToken()){}
、内部コレクションを実行Dispose
して、カウントとビジー状態を処理することができます。
c# - WPF XBAP アプリケーションの終了時にバックグラウンド タスクをキャンセルする
バックグラウンドでデータをダウンロードする wpf xbap アプリケーションがあります。アプリケーションの終了時に、ダウンロードを停止してキャッシュをフラッシュする必要があります。現在は次のように実装されています:
App.xaml:
App.xaml.cs :
BackgroundImageLoader.cs :
Stop が呼び出され、loaderTask は null ではなく、Status は Running ですが、ts.Cancel() の後 IsCancellationRequested プロパティは変更されません (ここで説明されているように、タスク全体を while(true){..} 内にラップした後でも)。読み込みが停止しますが、自動 GC のおかげでのみ発生すると思います。私のフラッシュメソッドは実行されません。私は何が欠けていますか?psまた、別のスレッドで同時にタスクを実行するように機能をリファクタリングする必要がありますが、副作用を恐れています。どんな助けでも感謝します。前もって感謝します。
android - 接続しているHttpURLConnectionを停止します
この質問は、少し前に質問され、回答されました。リンク。しかし、答えはまだ私を助けませんでした。私は他の投稿のOPと同じような立場にあります。特定のウェブサイトに接続する非同期タスクがありますが、インターネット接続が遅いため、ほとんどの場合、接続に時間がかかります。ユーザーがいつでも接続の試行を停止できるようにしたいと思います。
ボタンが押されるたびに、接続が確立された後にのみAsyncTask全体がキャンセルされます。ボタンを押すだけでプロセス全体をすぐに停止することは可能ですか?デフォルトのhttpurlconnectionを使用して実行できますか?
con.getInputStream
がビジー状態のときに切断を使用して例外をトリガーしようとしましたが、機能しませんでした。
c# - DropNet で CancellationToken サポートを実装するには?
MonoTouch アプリで DropBox API に非同期でアクセスしたいと考えています。それ自体がRestSharpに依存しているDropNet
を使用すると便利だと思いました。
どちらのライブラリもうまく機能しますが、Task
s を返す DropNet オーバーロードでは、リクエストをキャンセル トークンに関連付ける方法がありません。
これは、それらの実装がどのように見えるかです:
ExecuteTask
実装は Laurent Kempé に基づいてTaskCompletionSource
おり、もともとはLaurent Kempé によって書かれました:
でのキャンセルをサポートするためにこのコードを変更または拡張するにはどうすればよいCancellationToken
ですか?
私はそれを次のように呼びたいです:
c# - スレッドの停止、ManualResetEvent、volatile boolean、cancellationToken
Windowsサービスにスレッド(STAThread)があり、大量の作業を実行します。Windowsサービスが再起動されたら、このスレッドを正常に停止したいと思います。
私はいくつかの方法を知っています
- 揮発性ブール
- ManualResetEvent
- CancellationToken
私がThread.Abortを見つけた限り、それはダメです...
ベストプラクティスは何ですか?作業はスレッドが開始されたクラスとは別のクラスで実行されるため、コンストラクターにcancellationTokenパラメーターを導入するか、たとえば揮発性変数を使用する必要があります。しかし、私は何が最も賢いのか理解できません。
更新
少し明確にするために、私が話していることの非常に簡単な例をまとめました。前に述べたように、これはWindowsサービスで実行されています。現在、ループまたはcancellationTokenでチェックされる揮発性ブール値を考えています。ループが終了するのを待つことはできません。以下に説明するように、数分かかる場合があり、サーバーのシステム管理者は次のように信じています。サービスを再起動する必要があるときに、サービスに問題があります。問題なくループ内のすべての作業を問題なくドロップできますが、スレッドではこれを実行できません。中止すると、「悪」であり、さらにCOMです。インターフェイスが呼び出されるため、小さなクリーンアップが必要です。
UPDATE
コードでisCancelled状態が「調べられた」cancellationTokenを使用してパフォーマンスを調べたところ、ManualResetEventSlimでwaitOneを使用するよりもはるかに高速です。いくつかの簡単な数字、forループで100.000.000回反復するcancellationTokenの場合は約 500ミリ秒、WaitOneの費用は約。3秒。したがって、このシナリオでのパフォーマンスは、cancellationTokenを使用する方が高速です。
c# - メソッドの実行をキャンセルする適切な方法
重複の可能性:
TPL タスクを中止/キャンセルするにはどうすればよいですか?
実行に時間がかかるメソッドがあるため、結果をコールバックとして返します。私の方法は次のようになります。
ユーザーが待ちたくない場合に備えて、そのメソッドの実行を停止できるようにしたいと思います。その結果、これは私が解決したものです:
メソッドの実行を中止するより適切な方法は何ですか?
編集
回答ありがとうございます。キャンセルトークンのことを今思い出しました。トークンのことは覚えにくいです。私はこのアプローチを使用すると思います:
この質問に対する回答で提案されたアプローチと、このアプローチを使用する方が良いでしょうか。私はこのアプローチの方が好きです。キャンセルトークンの方が読みやすいと思います。
PS。私の Visual Studio は多くのスペースを配置します。コードを自由にフォーマットしてください:)
.net-4.5 - 非同期リポジトリと CancellationToken
.NET 4.5 に移行しており、リポジトリに async を追加することを検討しています。
実装では、DB、WebServices などを呼び出す可能性があります。
私の質問は、CancellationToken をサポートする必要がありますか?
(心配しないでください - FindAllAsync() はおそらく Rx ベースになるでしょう :) )