如何显示动画等待窗口,而数据库相关的工作正在进行中

本文关键字:数据库 工作 进行中 何显示 显示 窗口 等待 动画 | 更新日期: 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>