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

时间:2013-03-26 05:55:37

标签: c# multithreading winforms async-await

我正在研究C#4.0 WinForm应用程序,这些实际上是与会计相关的应用程序,主要功能是将数据保存在数据库中并从中检索。

使用SqlServer 2008 r2 Express后端。

问题是当我们在数据库上执行命令时需要几秒钟的时间,那时我的应用程序主窗口就会停止。

当我在数据库上执行整个命令时,在主应用程序上执行数据库执行时返回命令。

就像“NonQuery()”

所以,我在它之前显示一个表单并在命令之后关闭该表单,但问题是我在表单上放了一个GIF图像,因为在主应用程序上停止执行,gif不会显示动画直到命令执行。

所以我把它放在BackGroundWorker上,但主线程停止,所以它的孩子也会停止。

我们不能把数据库事务放在后台工作器中,因为某些时候工作依赖于从数据库中检索到的结果,我们想要暂停应用程序直到未获取数据,但在这种情况下我们也希望在等待表单上,gif图像应该显示其动画。

在这种情况下该怎么做,以及如何做。

4 个答案:

答案 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>