从不同的线程向ListView添加项目? (跨线程操作无效)

时间:2010-09-15 19:10:01

标签: c# winforms multithreading

我正在尝试将项目添加到与创建的不同的线程中的列表视图中,并且遇到跨线程错误。如何在其他线程中访问此元素?

2 个答案:

答案 0 :(得分:2)

尝试使用属性控件:InvokeRequired - http://msdn.microsoft.com/en-us/library/ms171728%28VS.80%29.aspx

private delegate void AddItemCallback(object o);

private void AddItem(object o)
{
    if (this.listView.InvokeRequired)
    {
        AddItemCallback d = new AddItemCallback(AddItem);
        this.Invoke(d, new object[] { o });
    }
    else
    {
        // code that adds item to listView (in this case $o)
    }
}

答案 1 :(得分:0)

使用执行更新的Task,使用TaskScheduler.FromCurrentSynchronizationContext安排到用户界面。

http://msdn.microsoft.com/en-us/library/dd997394.aspx

这种方法优于Control.Invoke的优势在于它可以在WPF,Silverlight, Windows窗体中使用,而Control.Invoke仅适用于Windows窗体。

P.S。如果您尚未使用.NET 4.0,则Rx library中可以使用TaskTaskScheduler