当girdview填充时,我的装载将被冻结

时间:2016-11-06 12:51:56

标签: c# datagridview

我有一个datagridview,加载数据源需要一些时间。我想为它做一个加载,我尝试了后台工作者和异步等待和task.factory.startnew和task.run和...但是当datagridview填充我的加载gif将被冻结。

我该怎么办?

我搜索了很多,我看到了一个文字。他们说我们只有一个ui线程,当一个人正在工作时,另一个将被冻结是正确的吗? 我见过很多像这种情况的帖子,我已经试了5天但不成功。也许有一个我无法看到的明确的事情。

例如,就像gif正在加载并且富文本框正在填充的情况: 当我们处于巨大的功能时,pictureBox1将被冻结

private  void  button1_Click (object sender, EventArgs e)
   {

     Task.Factory.StartNew(()=>;
     {
         huge();
     }
         );

   }



private void huge()
    {
        richTextBox1.Invoke(new EventHandler(delegate
            {


                    for (int i = 0; i < 10000; i++)
                    {
                        richTextBox1.Text += "s";
                    }

            }));
        pictureBox1.Visible = false;
    }

1 个答案:

答案 0 :(得分:0)

让我解释一下你在这里做了什么:

 Task.Factory.StartNew(()=>;
     {
         huge();
     }
         );

=&GT;创建一个线程来执行巨大的功能

 richTextBox1.Invoke(new EventHandler(delegate
            {


                    for (int i = 0; i < 10000; i++)
                    {
                        richTextBox1.Text += "s";
                    }

            }));

=&GT;调用UI线程(正如你所说:我们有only one UI Thread which executes synchronously)并运行循环来更新textBox。

因此,我不知道你想做什么,但通常我们做的是我们在backgroundworker中运行一些dataLoading / Fetching函数,这里,在每加载X%之后我们调用UI线程来更新用户的信息。

在您的情况下,您似乎只为用户显示gif作为服务员。因此,您应该可以执行以下操作:

private  void  button1_Click (object sender, EventArgs e)
   {
     DisplayMyGif(); //will display the gif on the UI thread, because click always comes from the UI
     Task.Factory.StartNew(()=>;
     {
         LoadMyData(); //should load the data asynchronously on a different Thread
     }
         );

   }

希望它有所帮助。