我希望我的后台工作者将项目添加到列表框中,它在调试时似乎这样做,但列表框不显示值.我怀疑这与在后台工作线程中添加项目有关,我是否需要将这些添加到数组中,然后在数组中填充列表框backgroundWorker1_RunWorkerCompleted
?
谢谢您的帮助.
Gon*_*ero 13
您可以像这样使用Invoke:
private void AddToListBox(object oo)
{
Invoke(new MethodInvoker(
delegate { listBox.Items.Add(oo); }
));
}
Run Code Online (Sandbox Code Playgroud)
您可以,但是您必须建议您的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);
}
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式在后台线程上添加它们:
Form.Invoke
Run Code Online (Sandbox Code Playgroud)
或者
Form.BeginInvoke
Run Code Online (Sandbox Code Playgroud)
将调用从后台线程编组到主 UI 线程所需。不过我很确定BackgroundWorker 提供了一个在Foreground 线程上自动调用的事件,并且您应该能够毫无问题地更新此事件。这是“ProgressChanged”,可以由后台工作进程通过调用 ReportProgress 来触发。
您是否也尝试过调用.Refresh()
列表框?