我有一个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;
}
答案 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
}
);
}
希望它有所帮助。