C# 是否可以从BackgroundWorker ProgressChanged访问ListView项?

C# 是否可以从BackgroundWorker ProgressChanged访问ListView项?,c#,backgroundworker,C#,Backgroundworker,BackgroundWorker ProgressChanged正在更新我的UI。它有一个进度条和一个列表视图,其中显示backgroundworker正在处理的每个项目的文件名 我只想在listview中添加一个新文件项,因此我尝试在listview中的最后一个项目和当前文件名之间进行比较 但是,这会抛出TargetInvocation错误 void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)

BackgroundWorker ProgressChanged正在更新我的UI。它有一个进度条和一个列表视图,其中显示backgroundworker正在处理的每个项目的文件名

我只想在listview中添加一个新文件项,因此我尝试在listview中的最后一个项目和当前文件名之间进行比较

但是,这会抛出TargetInvocation错误

void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {

        var r = Enumerable.Empty<ListViewItem>();
        if (this.listView1.Items.Count > 0)
            r = this.listView1.Items.OfType<ListViewItem>();

        var last = r.LastOrDefault();

        if (last.Text != CurrentTrack.Name)
        {
            ListViewItem LVI = new ListViewItem(currentTrack.Name);
            LVI.SubItems.Add(keywords);
            LVI.SubItems.Add("Updated");
            listView1.Items.Add(LVI);
            listView1.TopItem = LVI;
            listView1.EnsureVisible(listView1.Items.Count - 1);
        }


        progressBar1.Value = e.ProgressPercentage;
        lblStatus.Text = "Processing......" + progressBar1.Value.ToString() + "%";
    }
void m\u oWorker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
var r=Enumerable.Empty();
如果(this.listView1.Items.Count>0)
r=this.listView1.Items.OfType();
var last=r.LastOrDefault();
if(last.Text!=CurrentTrack.Name)
{
ListViewItem LVI=新ListViewItem(currentTrack.Name);
LVI.SubItems.Add(关键字);
LVI.子项。添加(“更新”);
listView1.Items.Add(LVI);
listView1.TopItem=LVI;
listView1.EnsureRevible(listView1.Items.Count-1);
}
progressBar1.值=e.ProgressPercentage;
lblStatus.Text=“处理……”+progressBar1.Value.ToString()+“%”;
}

有可能做到这一点吗?

您需要在UI线程上执行UI更改。这可以使用以下代码实现:

frmMain()
{
    Worker_ProgressChanged = new Worker_ProgressChanged_Delegate(m_oWorker_ProgressChanged);
}

delegate void Worker_ProgressChanged_Delegate(object sender, ProgressChangedEventArgs e);
Worker_ProgressChanged_Delegate Worker_ProcessChanged;
void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    if (this.InvokeRequired)
    {
        this.Invoke(Worker_ProgressChanged, sender, e);
    }
    else
    {
        ... Add list items etc.
    }
如果工作线程调用此方法,则InvokeRequired将为true。然后,表单将使用其线程(UI线程)调用相同的方法。这次invokererequired为false,函数在正确的线程上执行


编辑:根据注释将列表项移动到else块中

这是否会引发相同的错误

    void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        ListViewItem last = null;
        if (this.listView1.Items.Count > 0)
        {
            last = this.listView1.Items[listView1.Items.Count - 1];
        }
        if (last == null || last.Text != CurrentTrack.Name)
        {
            ListViewItem LVI = new ListViewItem(currentTrack.Name);
            LVI.SubItems.Add(keywords);
            LVI.SubItems.Add("Updated");
            listView1.Items.Add(LVI);
            listView1.TopItem = LVI;
            listView1.EnsureVisible(listView1.Items.Count - 1);
        }

        progressBar1.Value = e.ProgressPercentage;
        lblStatus.Text = "Processing......" + progressBar1.Value.ToString() + "%";
    }

您得到的是哪一行号?请确保将
添加列表项等
放在if语句的else子句中