6

バックグラウンド ワーカーにリスト ボックスに項目を追加してもらいたいのですが、デバッグ時にそうしているように見えますが、リスト ボックスに値が表示されません。これは、バックグラウンド ワーカー スレッド内でアイテムを追加することと関係があると思われます。これらを配列に追加し、実行中に配列からリスト ボックスにデータを入力する必要がありますbackgroundWorker1_RunWorkerCompletedか?

助けてくれてありがとう。

4

6 に答える 6

14

次のように Invoke を使用できます。

private void AddToListBox(object oo)
{
    Invoke(new MethodInvoker(
                   delegate { listBox.Items.Add(oo); }
                   ));
}
于 2008-12-15T11:00:26.923 に答える
6

可能ですが、バックグラウンドワーカーに状態を報告するようにアドバイスし、現在の状態を含むボックスの入力をそのイベントに送信する必要があります。そのイベントのメソッドで、ボックスにアクセスして新しい値を入れることができます。

それ以外の場合は、手動で呼び出す必要があります。

 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);
        }
于 2008-12-15T10:58:16.020 に答える
1

次のような関数を追加して、メイン スレッドまたはバックグラウンド スレッドからリスト ボックスに項目を追加できるようにします。このスレッドは、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 ...
  }
于 2009-01-09T19:14:26.437 に答える
1

以下の方法で、バックグラウンド スレッドでそれらを追加できます。

Form.Invoke

また

Form.BeginInvoke

これは、バックグラウンド スレッドからメイン UI スレッドへの呼び出しをマーシャリングするために必要です。ただし、BackgroundWorker はフォアグラウンド スレッドで自動的に呼び出されるイベントを提供していると確信しており、このイベントを問題なく更新できるはずです。これは「ProgressChanged」であり、ReportProgress を呼び出すことによってバックグラウンド ワーカー プロセスによって起動できます。

リストボックスでも呼び出し.Refresh()てみましたか?

于 2008-12-15T10:57:02.903 に答える
0

Application.Doevents()関数は問題を解決します。

于 2010-08-30T09:27:29.467 に答える