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];
        ...
    }
}

BackgroundWorker跨线程错误ListView参数

由于您是从一个单独的线程访问它,因此您需要使用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事件中使用。