C# 异步搜索一组数据,并显示响应“响应”;“正在加载…”;消息
我被要求实现一个C# 异步搜索一组数据,并显示响应“响应”;“正在加载…”;消息,c#,.net,winforms,C#,.net,Winforms,我被要求实现一个DataGridView,它显示大量数据(目前为100000行),并具有搜索功能。网格已经实现,搜索工作正常。当CPU搜索网格时,我需要一个合适的加载。。。信息或图片。唯一的问题是我的UI没有响应,它会停止(挂起)直到搜索完成 我尝试了gif,但它没有收到足够的CPU时间,所以它就像一个死图像。 我尝试了一个带有“加载…”信息的标签,标签上的圆点被及时添加,看起来很有活力,但也挂着 我是线程和异步编程新手。我搜索了很多,但没有得到完整的概念。我甚至分出了十几个示例代码,但仍然无法
DataGridView
,它显示大量数据(目前为100000行),并具有搜索功能。网格已经实现,搜索工作正常。当CPU搜索网格时,我需要一个合适的加载。。。信息或图片。唯一的问题是我的UI没有响应,它会停止(挂起)直到搜索完成
我尝试了gif
,但它没有收到足够的CPU时间,所以它就像一个死图像。
我尝试了一个带有“加载…”信息的标签,标签上的圆点被及时添加,看起来很有活力,但也挂着
我是线程和异步编程新手。我搜索了很多,但没有得到完整的概念。我甚至分出了十几个示例代码,但仍然无法解决这个难题
有人能用这个例子给我一个提示,让我更好地理解这个概念并学习如何异步思考吗?谁(哪个线程)应该执行搜索,谁应该执行绘制?搜索功能需要从UI线程中移出。UI线程正在运行搜索,无法同时更新UI 最好的解决方案是使用
BackgroundWorker
进行搜索,并使用UI线程显示您想要的任何等待消息
这里有一个指向MSDN教程的链接,该教程介绍了如何使用BackgroundWorker
s:
对于.net 4.5,使用异步/等待
private async void btnSearchClick(object sender, EventArgs e)
{
label1.Text = "Searching";
await Task.Run(() => { Thread.Sleep(5000); dataGridView1.Refresh();/*search here*/ });
label1.Text = "Finished"; ;
}
对于.NET4,使用带有主线程调用的任务
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";
}));
});
;
}
从用户体验的角度来看,100000行的网格有什么可能的用途?在我看来,这是一个毫无用处的要求,应该向你的上级提出质疑。真正地滚动条移动的1px大约为100行。无意义。添加“无意义”评论:这也是有害的,因为用户可能倾向于依赖这样的大视图,试图让自己快速了解数据的一般性质。事实证明,对于超过6000条记录的任何记录,人类在这方面都非常糟糕,反而会在网格中真正包含的内容上严重误导自己。我完全同意你的观点,问题是,负责人出于各种原因想要手头上的全部数据,而根据他们的网络和距离状况,这些原因并不坏;使用
wait Task.Run()
。问题是我的搜索方法占用了所有CPU时间,而后台工作程序(我已经尝试过)没有从CPU获得足够的时间,因此绘制作业失败。感谢您的回复,如果我希望消息是交互式的,该怎么办?我的意思是每500毫秒增加点,直到有3个点,然后这些点消失,然后重复。在这个场景中,我想快速刷新UI。创建您自己的控件,在该控件中有2个方法,Start()和Stop(),在方法Start()中使用Timer为每500ms添加/删除点,Stop()将停止Timer。最后在搜索函数中调用yourControl.Start()和Stop()