私はbackgroundworker
を使用して、インクリメンタルサーチを実装しようとしています。C#winformでエラーbackgroundworkerを入力してください。
だから、アイデアは上部のtextbox
におけるユーザーの種類であり、各キーストロークのために、以下のlistview
は、ユーザが入力した文字が含まれている項目のみを含むようにフィルタリングされます。
私は最近、backgroundworker
コンポーネントについて学んだので、それを使用してフィルタリングを行い、listbox
を更新しようとしていました。
これはtextbox
のイベントコードである:
private void txtSearch_TextChanged(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
}
}
とbackgroundworker
イベントである:
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
if (txtSearch.Text != String.Empty)
{
GetTheListOfFiles();
listView.Items.Clear(); << Exception occurs here !
...... //some more code to populate the listview control
}
}
PROBLEM
Iはtextbox
に入力すると、私は期待していましたlistbox
はすぐに私のキーストロークとdispに応答しますそれに応じてフィルタリングされたデータを配置する。代わりに、約8秒の一時停止があると、私はこのエラーを取得する:
私は、問題は、私が強調しているが、私はそれを解決する方法が分からないビットであると推定します。 backgroundworker
はこの目的のために使用できないのですか、私の実装で何かが欠けていますか?
PS:これを達成するための方法は何か歓迎します。経験豊かなプログラマーの間には、より良い解決策があるのでしょうか?
UPDATEここ
は、私が使用していますprogresschanged
イベントです:
private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
toolStripProgressBar1.Value = e.ProgressPercentage;
tsLabelTwo.Text = e.ProgressPercentage.ToString() + @"%";
}
おかげ
可能な重複がありません:コントロール、アクセスしたが、それが作成されたスレッド以外のスレッドから](http://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from-a-thread-other-than-the ) – MickyD
BackgroundWorkerのDoWorkイベントは、更新しようとしているUIコントロールとは異なるスレッドに存在します。これはよく知られている問題です。コントロールを更新する場合は、UIの同じスレッドで実行されるProgressChangedイベントを発生させる必要があります。 – Steve
ありがとうございました。スティーブ、iveはprogresschangedイベントコードを追加しました。初心者質問:どのスレッドが実行されるのかをどのように知っていますか?歓声 – Nick