BackgroundWorkerの正しい停止方法
質問
私は2つのコンボボックスがあるフォームを持っています。そして私は満たしたい
combobox2.DataSource
に基づいて
combobox1.Text
と
combobox2.Text
(で入力が完了したと仮定します)。
combobox1
への入力が完了し
combobox2
). そこで、私はイベントハンドラで
combobox2
をこのようにします。
private void combobox2_TextChanged(object sender, EventArgs e)
{
if (cmbDataSourceExtractor.IsBusy)
cmbDataSourceExtractor.CancelAsync();
var filledComboboxValues = new FilledComboboxValues{ V1 = combobox1.Text,
V2 = combobox2.Text};
cmbDataSourceExtractor.RunWorkerAsync(filledComboboxValues );
}
データソースの構築は時間がかかるので(データベースへのリクエストを作成して実行する)、BackgroundWorkerを使って別のプロセスで実行したほうがいいと判断しました。そこで、cmbDataSourceExtractorが作業を完了していないときに、ユーザーがもう一つシンボルをタイプするシナリオがある。この場合、私は次の行で例外を取得します。
cmbDataSourceExtractor.RunWorkerAsync(filledComboboxValues );
は、BackgroundWorkerがビジー状態であり、同時に複数のアクションを実行できないことを表しています。
この例外を取り除くにはどうすればよいですか。
事前にありがとうございます!
どのように解決するのですか?
CancelAsync
は実際にスレッドを中止させたりはしません。Worker スレッドに対して、作業をキャンセルするように
BackgroundWorker.CancellationPending
. バックグラウンドで実行されている DoWork デリゲートは定期的にこのプロパティをチェックし、キャンセル自体を処理する必要があります。
厄介なのは、あなたのDoWorkデリゲートはおそらくブロッキングしているということです。つまり、あなたがDataSourceに対して行う作業は、他の何か(CancellationPendingのチェックなど)を行う前に完了しなければならないということです。実際の作業を別の非同期デリゲートに移す必要があるかもしれません(あるいは、よりよい方法として、作業を
ThreadPool
に送信する)、この内部ワーカー スレッドが待機状態をトリガーするか、CancellationPending を検出するまで、メイン ワーカー スレッドにポーリングさせる必要があるかもしれません。
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.cancelasync.aspx
http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads.aspx
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] 他のスレッドからGUIを更新するにはどうすればよいですか?
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] 乱数(int)を生成する方法を教えてください。
-
[解決済み] DateTime型の誕生日から年齢を計算するにはどうしたらいいですか?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。