我正在研究C#4.0 WinForm应用程序,这些实际上是与会计相关的应用程序,主要功能是将数据保存在数据库中并从中检索。
使用SqlServer 2008 r2 Express后端。
问题是当我们在数据库上执行命令时需要几秒钟的时间,那时我的应用程序主窗口就会停止。
当我在数据库上执行整个命令时,在主应用程序上执行数据库执行时返回命令。
就像“NonQuery()”
所以,我在它之前显示一个表单并在命令之后关闭该表单,但问题是我在表单上放了一个GIF图像,因为在主应用程序上停止执行,gif不会显示动画直到命令执行。
所以我把它放在BackGroundWorker上,但主线程停止,所以它的孩子也会停止。
我们不能把数据库事务放在后台工作器中,因为某些时候工作依赖于从数据库中检索到的结果,我们想要暂停应用程序直到未获取数据,但在这种情况下我们也希望在等待表单上,gif图像应该显示其动画。在这种情况下该怎么做,以及如何做。
答案 0 :(得分:2)
使用BackgroundWorker
进行SQL taransiction,但在开始Form.Enabled=False
之前放BackgroundWorker
,然后在BackgroundWorker的Form.Enabled=true
事件上放RunWorkerCompleted
。
这将释放一个用于显示.gif图片动画的主线程,并在所有数据查询准备好之前阻止用户继续工作。
或者,如果.Enabled=false
看起来很难看,你可以创建一个方法来激活/禁用所有主要按钮/控件并阻止用户做事......
或使用.ShowDialog()
方法打开其他表单(使用动画.gif文件)。然后从此表单开始BackgroundWorker
并阻止用户在SQl转换准备就绪之前关闭此“第二”表单...
答案 1 :(得分:1)
您可以在新线程中运行您的方法:
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线程,并且只需要很少的修改。
答案 2 :(得分:0)
我不完全理解为什么你不能使用Backgroundworker ......
您可以尝试使用关键字async并等待数据库内容,以便表单不会冻结。您可以查看this
答案 3 :(得分:0)
这个名为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>