我被要求实现一个显示大量数据的DataGridView
(现在为100.000行)并具有搜索功能。网格已实现,搜索工作正常。当CPU正在搜索网格时,我需要一个正确的Loading ...消息或图片。唯一的问题是我的UI没有响应,它会停止(挂起),直到搜索完成。
我尝试了gif
并且它没有获得足够的CPU时间,因此它就像一张死像。
我尝试了一个带有“正在加载......”的标签,其中的点被及时添加并具有动态外观,但这也是悬挂。
我是线程和异步编程的新手。我搜索了很多,但没有得到整个概念。我甚至分叉了十几个示例代码,但我仍然无法解决这个难题。
有人可以给我一个这个例子的提示,以便我能更好地理解这个概念并学习如何思考异步吗?谁(哪个线程)应该进行搜索以及谁应该进行绘画?
答案 0 :(得分:0)
搜索功能需要移出UI线程。 UI线程正在运行搜索,无法同时更新UI。
最好的解决方案是使用BackgroundWorker
进行搜索,并使用UI线程显示您想要的任何等待消息。
这是指向MSDN上有关如何使用BackgroundWorker
的教程的链接:
https://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx
答案 1 :(得分:0)
使用.net 4.5,使用async / await
private async void btnSearchClick(object sender, EventArgs e)
{
label1.Text = "Searching";
await Task.Run(() => { Thread.Sleep(5000); dataGridView1.Refresh();/*search here*/ });
label1.Text = "Finished"; ;
}
使用.net 4,使用Task with Invoking for main thread
private void btnSearchClick(object sender, EventArgs e)
{
label1.Text = "Searching";
Task.Run(() => {
Thread.Sleep(5000);
this.BeginInvoke((Action)(() =>
{
dataGridView1.Refresh();/*search here*/
label1.Text = "Finished";
}));
});
;
}