如何显示动画等待窗口,而数据库相关的工作正在进行中
本文关键字:数据库 工作 进行中 何显示 显示 窗口 等待 动画 | 更新日期: 2023-09-27 18:05:57
我正在开发c# 4.0的WinForm应用程序,这些实际上是与会计相关的应用程序,主要功能是在数据库中保存数据并从中检索。
使用SqlServer 2008 r2 Express.
问题是当我们在数据库上执行命令时,它需要几秒钟的时间,这时我的应用程序主窗口停止了。
当我在数据库上执行命令时,当整个命令在数据库上执行时,返回到主应用程序。
就像"NonQuery() "
所以,我在它之前显示一个表单,并在命令之后关闭该表单,但问题是我在表单上放了一个GIF图像,因为在主应用程序上停止了执行,GIF不显示动画,直到命令执行。
所以我把它放在一个BackGroundWorker上,但是主线程停止了,所以它的子线程也停止了。
我们不能把数据库事务放在后台worker中,因为有时工作依赖于从数据库中检索到的结果,我们想要暂停应用程序,直到数据没有被检索到,但在这种情况下,我们也希望在等待表单上,GIF图像应该显示它的动画。
在这种情况下做什么,以及如何做
使用BackgroundWorker
进行SQL转换,但在启动BackgroundWorker
之前放置Form.Enabled=False
,然后在BackgroundWorker的RunWorkerCompleted
事件上启动Form.Enabled=true
。
这将释放一个主线程用于显示gif图片的动画,并在所有数据查询准备好之前停止用户继续工作。
或者如果.Enabled=false
对你来说看起来很丑,你可以创建一个方法来激活/禁用所有的主按钮/控件和停止用户做的事情…
或者使用.ShowDialog()
方法打开其他表单(带有动画的。gif)。然后从这个表单开始一个BackgroundWorker
,防止用户在SQl事务准备好之前关闭这个"第二"表单…
你可以在新的线程中运行你的方法:
Thread query = new Thread(() => Method("Method", "Parameters", Blah));
query.Start();
//start your animation
while (query.IsAlive)
{
Application.DoEvents();
Thread.Sleep(10);
}
//end your animation
这将为你的动画释放UI线程,并且需要最小的修改。
我不太明白为什么你不能使用Backgroundworker…
您可以尝试使用关键字async和等待数据库的东西,这样表单就不会冻结。你可以看看这个
这个功能叫做loader…显示加载页面需要时间…
"
加载…
"
<asp:UpdateProgress ID="updateProgress1" runat="server">
<ProgressTemplate>
<div id="progressBackgroundFilter">
</div>
<div id="processMessage" style="text-align: center">
<asp:Image ID="imgLoader" runat="server" ImageUrl="~/Images/loader.gif" />
<br />
<b>Loading...</b>
</div>
</ProgressTemplate>