バックグラウンド ワーカーにリスト ボックスに項目を追加してもらいたいのですが、デバッグ時にそうしているように見えますが、リスト ボックスに値が表示されません。これは、バックグラウンド ワーカー スレッド内でアイテムを追加することと関係があると思われます。これらを配列に追加し、実行中に配列からリスト ボックスにデータを入力する必要がありますbackgroundWorker1_RunWorkerCompleted
か?
助けてくれてありがとう。
バックグラウンド ワーカーにリスト ボックスに項目を追加してもらいたいのですが、デバッグ時にそうしているように見えますが、リスト ボックスに値が表示されません。これは、バックグラウンド ワーカー スレッド内でアイテムを追加することと関係があると思われます。これらを配列に追加し、実行中に配列からリスト ボックスにデータを入力する必要がありますbackgroundWorker1_RunWorkerCompleted
か?
助けてくれてありがとう。
次のように Invoke を使用できます。
private void AddToListBox(object oo)
{
Invoke(new MethodInvoker(
delegate { listBox.Items.Add(oo); }
));
}
可能ですが、バックグラウンドワーカーに状態を報告するようにアドバイスし、現在の状態を含むボックスの入力をそのイベントに送信する必要があります。そのイベントのメソッドで、ボックスにアクセスして新しい値を入れることができます。
それ以外の場合は、手動で呼び出す必要があります。
public Form1()
{
InitializeComponent();
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync();
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10; i++)
{
((BackgroundWorker)sender).ReportProgress(0, i.ToString());
}
}
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
listBox1.Items.Add((string)e.UserState);
}
次のような関数を追加して、メイン スレッドまたはバックグラウンド スレッドからリスト ボックスに項目を追加できるようにします。このスレッドは、Invoke が必要かどうかを確認し、必要な場合は Invoke を使用します。
delegate void AddListItemDelegate(string name,object otherInfoNeeded);
private void
AddListItem(
string name,
object otherInfoNeeded
)
{
if (InvokeRequired)
{
BeginInvoke(new AddListItemDelegate(AddListItem), name, otherInfoNeeded
return;
}
... add code to create list box item and insert in list here ...
}
以下の方法で、バックグラウンド スレッドでそれらを追加できます。
Form.Invoke
また
Form.BeginInvoke
これは、バックグラウンド スレッドからメイン UI スレッドへの呼び出しをマーシャリングするために必要です。ただし、BackgroundWorker はフォアグラウンド スレッドで自動的に呼び出されるイベントを提供していると確信しており、このイベントを問題なく更新できるはずです。これは「ProgressChanged」であり、ReportProgress を呼び出すことによってバックグラウンド ワーカー プロセスによって起動できます。
リストボックスでも呼び出し.Refresh()
てみましたか?
Application.Doevents()
関数は問題を解決します。