C# 什么';将数据异步加载到数据网格视图的最佳方式是什么?

C# 什么';将数据异步加载到数据网格视图的最佳方式是什么?,c#,.net,xml,forms,C#,.net,Xml,Forms,此代码允许在加载数据之前加载表单,但表单上的某些组件(如按钮和datagridview本身)在加载数据之前是“不可见”的 如何解决此问题 private void Form1_Load(object sender, EventArgs e) { Thread t = new Thread(new ThreadStart(delegate() { this.Invoke(new MyDelegate(delegate()

此代码允许在加载数据之前加载表单,但表单上的某些组件(如按钮和datagridview本身)在加载数据之前是“不可见”的

如何解决此问题

    private void Form1_Load(object sender, EventArgs e)
    {
        Thread t = new Thread(new ThreadStart(delegate()
        {
            this.Invoke(new MyDelegate(delegate()
            {               
                ReadXml(path);
                Bind();
           }));              
        }));

        t.Start();
     }

    private void Bind()
    {
        dataGridView1.DataSource = table;
    }
我还有另外一个代码,它工作得更好,但需要使用2个新线程。这不是最好的办法,对吗

    private void Form1_Load(object sender, EventArgs e)
    {
        Thread t = new Thread(new ThreadStart(delegate()
          {
              this.Invoke(new InvokeDelegate(delegate()
              {
                  Thread t2 = new Thread(new ThreadStart(delegate()
                  {
                      ReadXml(path);
                  }));
                  t2.Start();
                  t2.Join();
                  Bind();
              }));
          }));

        t.Start();
    }
表单计时器(不是系统计时器)将让所有其他消息在触发之前进行处理

只要给它一个100-250毫秒的间隔; 在设计器中将其设置为enabled=false; 在form_load事件中将其设置为enabled=true。 在timer_tick事件中,使第一行timer.enabled=false。 之后(仍在勾号事件中)加载网格。

如果使用BeginInvoke()而不是Invoke(),则委托中的代码将在当前UI线程上执行,但直到当前所有挂起的UI工作完成后才会发生(如当前Form1\u加载调用)。Invoke是一个同步调用,因此您需要线程

   void Form1_Load(object sender, EventArgs e)
    {
        this.BeginInvoke(new MyDelegate(delegate()
        {
            ReadXml(path);
            Bind();
        }));
    }

如果这是唯一一个在表单加载上运行的代码,那么在我看来,一切都应该完美而顺利地工作。在这一点上,有一些esle的东西阻碍了您的UI。检查一下……或者我看到
Bind()
方法,如果该方法实际将数据放在UI上,那可能是一个阻塞调用。这就是我的Form1\u Load事件处理程序过程中的全部内容。Bind()就是这样做的:dataGridView1.DataSource=table;这里不需要线。它所要做的就是发回消息循环来执行调用,该调用将返回到UI线程。这意味着它不能运行,直到Form1_加载(在UI线程上)返回为止。我不知道该线程怎么可能是不必要的。当我去掉它时,直到ReadXML()returnsTry为您的答案提供一些解释,而不仅仅是提供一个代码块,表单才会加载。它将帮助其他用户理解答案,而不是纠正局部问题。谢谢说得好,我没有费心,因为这是在上面的评论,但我可以看到有人不一定会钻他们