BackgroundWorker跨线程错误ListView参数
本文关键字:ListView 参数 错误 线程 BackgroundWorker | 更新日期: 2023-09-27 18:11:32
为什么我得到"ListViewItem lviFile = lvFiles.Items[I];"一个跨线程错误,即使我使用DoWorkEventArgs e的ListView参数?
private void btUpload_Click(object sender, EventArgs e)
{
bwUpload.RunWorkerAsync(lvFiles);
}
private void bwUpload_DoWork(object sender, DoWorkEventArgs e)
{
ListView lvFiles = (ListView)e.Argument;
for (int i = 0; i < lvFiles.Items.Count; i++)
{
ListViewItem lviFile = lviFile.Items[i];
...
}
}
由于您是从一个单独的线程访问它,因此您需要使用Invoke
才能使用它。
private void btUpload_Click(object sender, EventArgs e)
{
bwUpload.RunWorkerAsync(lvFiles);
}
private void bwUpload_DoWork(object sender, DoWorkEventArgs e)
{
ListView lvFiles = (ListView)e.Argument;
for (int i = 0; i < lvFiles.Items.Count; i++)
{
Invoke(new MethodInvoker(() =>
{
ListViewItem lviFile = lviFile.Items[i];
...
});
}
}
如果您想使用控件。您必须在创建控件的线程中调用任务。
更多信息点击这里
您应该使用BackgroundWorker.ProgressChanged
来使用DoWork()
方法的更改来更新UI。在BackgroundWorker
上调用ReportProgress()
允许您传递object
作为第二个参数,然后您可以在ProgressChanged
事件中使用。