C#我可以使用backgroundwork线程向列表框添加值吗?

我希望我的后台工作者将项目添加到列表框中,它在调试时似乎这样做,但列表框不显示值。 我怀疑这与在后台工作线程中添加项目有关,我是否需要将这些添加到数组中,然后在backgroundWorker1_RunWorkerCompleted期间从数组中填充列表框?

谢谢您的帮助。

您可以像这样使用Invoke:

 private void AddToListBox(object oo) { Invoke(new MethodInvoker( delegate { listBox.Items.Add(oo); } )); } 

您可以,但是您必须建议您的Backgroundworker报告状态,并将具有当前状态的框的输入发送到该事件。 在该事件的方法中,您可以访问该框并将新值放入。

否则,您需要手动调用。

  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); } 

我添加如下所示的函数,以便我可以从主线程或后台线程向列表框添加项目。 Thi线程检查是否需要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提供了一个在Foreground线程上自动调用的事件,你应该可以在没有任何问题的情况下更新这个事件。 这是“ProgressChanged”,可以通过调用ReportProgress由后台工作进程触发。

您是否尝试过在列表框中调用.Refresh()

如果您尝试更新数据库。 从列表框中我建议创建一个数据集。

例如,如果您为数据库中的每个项目执行某些操作。 通过创建新数据集并通过mainDataset声明来复制数据库数据集。

例如:// gridview数据集是dataset1

 BackgroundWorker_DoWork(object sender, DoWorkArgs e) { Dataset dataset2 = dataset1; foreach(DataGridViewRow row in GridView) { //do some work dataset2.Main.AddMainRow(values to add); dataset2.AcceptChanges(); } } BackgroundWorker_WorkCompleted(object sender, DoWorkArgs e) { //Forces UI thread to valitdate dataset dataset2.update(); // Sets file Path string FilePath = "Some Path to file"; dataset2.writexml(FilePath, XmlWriteOptions.WriteSchema); //if you use xml to fill your dataset filepath to write should equal path to dataset1 xml dataset1.Refresh(); } 

请参阅为什么我收到此错误:“跨线程操作无效:控制从其创建的线程以外的线程访问的lbFolders。”? 了解更多信息。

Application.Doevents()函数将解决问题。