将数据异步加载到数据网格视图的最佳方法是什么?

时间:2012-08-15 20:04:56

标签: 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()
            {               
                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();
    }

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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