C# 线程不重新加载DataGridView

C# 线程不重新加载DataGridView,c#,multithreading,datagridview,C#,Multithreading,Datagridview,我有一个DataGridView,应该由线程重新加载。但是当线程执行时,DataGridView会闪烁,并且不会加载更改 有趣的是,如果我在线程上尝试代码,而不是在主线程上执行的线程上,那么DataGridView会很好地重新加载 这是我的密码: public void reloadClients(object source, EventArgs e) { //Console.WriteLine("Clients will reload.

我有一个DataGridView,应该由线程重新加载。但是当线程执行时,DataGridView会闪烁,并且不会加载更改

有趣的是,如果我在线程上尝试代码,而不是在主线程上执行的线程上,那么DataGridView会很好地重新加载

这是我的密码:

 public void reloadClients(object source, EventArgs e)
            {
                //Console.WriteLine("Clients will reload.");
                dgvClientes.DataSource = null;
                loadReloadClients = new Thread(new ThreadStart(jobReloadAllClients));
                loadReloadClients.Start();
            }

            private void jobReloadAllClients()
            {
                this.Invoke((MethodInvoker)delegate
                {             
                    descricaoCliente.Text = "CARREGANDO TODOS OS CLIENTES";      
                });

                System.Windows.Forms.BindingSource bs = new BindingSource();
                bs.DataSource = clientes.allClients().Tables["Clientes"];


                this.Invoke((MethodInvoker)delegate
                {
                    descricaoCliente.Text = "Todos os Clientes";
                    dgvClientes.DataSource = bs;
                    dgvClientes.Refresh();

                });

            }
编辑 正如我被告知在主线程上设置绑定数据源,并在后台线程上加载BD数据。。。。 Siveajet这是我到目前为止得到的

System.Windows.Forms.BindingSource bs;
    public void reloadClients(object source, EventArgs e)
    {
        //Console.WriteLine("Clients will reload.");
        dgvClientes.DataSource = null;
        bs = new BindingSource();
        dgvClientes.DataSource = bs;
        loadReloadClients = new Thread(new ThreadStart(jobReloadAllClients));
        loadReloadClients.Start();
    }

    private void jobReloadAllClients()
    {
        this.Invoke((MethodInvoker)delegate
        {             
            descricaoCliente.Text = "CARREGANDO TODOS OS CLIENTES";      
        });

        DataSet Setter = clientes.allClients();        
        this.Invoke((MethodInvoker)delegate
        {
            bs.DataSource = Setter.Tables["Clientes"];
            descricaoCliente.Text = "Todos os Clientes";
            //dgvClientes.DataSource = bs;
            //dgvClientes.Refresh();

        });

    }

我做到了。。。出于某种原因,我不得不取消分配变量bs,然后再次初始化它。。。现在它工作得很好

System.Windows.Forms.BindingSource bs;
    public void reloadClients(object source, EventArgs e)
    {
        //Console.WriteLine("Clients will reload.");
        bs = null;
        dgvClientes.DataSource = null;
        bs = new BindingSource();
        dgvClientes.DataSource = bs;
        loadReloadClients = new Thread(new ThreadStart(jobReloadAllClients));
        loadReloadClients.Start();
    }

    private void jobReloadAllClients()
    {
        this.Invoke((MethodInvoker)delegate
        {             
            descricaoCliente.Text = "CARREGANDO TODOS OS CLIENTES";      
        });

        DataSet Setter = clientes.allClients();        
        this.Invoke((MethodInvoker)delegate
        {
            bs.DataSource = Setter.Tables["Clientes"];
            descricaoCliente.Text = "Todos os Clientes";


        });

    }

在主线程上创建并使用一个bindingsource如何加载clientes.allClients.Tables[clientes];进入bindingSource?clientes.allClients.Tables[客户];它使用线程中的timeLoad数据表并分配bindingsource.datasource和invoke方法不起作用。。。我将bindingSource作为全局变量,在线程中加载datatable,并使用evoke方法分配bindingSource.datasource,并且没有结果=发布您得到的结果