C# 异步加载datagridview bindinglist时发生异常

C# 异步加载datagridview bindinglist时发生异常,c#,multithreading,datagridview,C#,Multithreading,Datagridview,当我尝试加载datagridview异步时,我收到一个InvalidOperationException消息:“由于对象的当前状态,操作无效。” 当我向BindingList添加一个项并且需要调用时,就会发生这种情况。如果没有线程,则不会引发异常。非常感谢您的帮助 以下是我用于向DataGridview添加项的方法: public static class ExtensionMethods { public static void LoadAsync<T>(this Data

当我尝试加载datagridview异步时,我收到一个InvalidOperationException消息:“由于对象的当前状态,操作无效。” 当我向BindingList添加一个项并且需要调用时,就会发生这种情况。如果没有线程,则不会引发异常。非常感谢您的帮助

以下是我用于向DataGridview添加项的方法:

public static class ExtensionMethods
{
    public static void LoadAsync<T>(this DataGridView gv, IEnumerable<T> enumerable)
    {
        gv.DataSource = new BindingList<T>();
        new Thread(() => gv.LoadItems(enumerable)) { IsBackground = true, Name = "AsyncLoad" }.Start();
    }

    private static void LoadItems<T>(this DataGridView gv, IEnumerable<T> enumerable)
    {
        foreach (T item in enumerable)          
            gv.AddItemToDataSourche(item);          
    }

    private static void AddItemToDataSourche<T>(this DataGridView gv, T item)
    {
        if (gv.InvokeRequired)
            gv.Invoke(new Action(() => gv.AddItemToDataSourche(item)));
        else
            ((BindingList<T>)gv.DataSource).Add(item); //This is where it goes wrong.
    }
}
公共静态类扩展方法
{
公共静态void LoadAsync(此DataGridView gv,IEnumerable可枚举)
{
gv.DataSource=newbindingList();
新线程(()=>gv.LoadItems(可枚举)){IsBackground=true,Name=“AsyncLoad”}.Start();
}
私有静态void LoadItems(此DataGridView gv,IEnumerable可枚举)
{
foreach(可枚举中的T项)
gv.附加数据源(项目);
}
私有静态void AddItemToDataSourche(此DataGridView gv,T项)
{
如果(gv.invokererequired)
gv.Invoke(新操作(()=>gv.AddItemToDataSourche(项));
其他的
((BindingList)gv.DataSource).Add(item);//这就是它出错的地方。
}
}
下面是我实例化DataGridView的方式:

public partial class Form1 : Form
{
    private DataGridView _gv = new DataGridView();
    private readonly IEnumerable<Person> _persons = new List<Person>
        {
            new Person {ID = 1, FirstName = "Test 1", LastName = "Someone"},
            new Person {ID = 2, FirstName = "Test 2", LastName = "Someone"},
            new Person {ID = 3, FirstName = "Test 3", LastName = "Someone"}
        };

    public Form1()
    {
        InitializeComponent();
        Controls.Add(_gv);
        _gv.LoadAsync(_persons);            
    }
}

public class Person
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
公共部分类表单1:表单
{
私有DataGridView_gv=新DataGridView();
私有只读IEnumerable\u persons=新列表
{
新人{ID=1,FirstName=“test1”,LastName=“Someone”},
新人{ID=2,FirstName=“test2”,LastName=“Someone”},
新人{ID=3,FirstName=“test3”,LastName=“Someone”}
};
公共表格1()
{
初始化组件();
控件。添加(_gv);
_gv.LoadAsync(_人);
}
}
公共阶层人士
{
公共int ID{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}

我认为DataGridView控件尚未处于该操作的就绪状态,因此它在构造函数中不起作用,Load方法似乎也太早,因此请尝试OnShown override方法:

protected override void OnShown(EventArgs e) {
  base.OnShown(e);
  _gv.LoadAsync(_persons);
}