0

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

后端使用 SqlServer 2008 r2 Express。

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

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

就像“NonQuery()”

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

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

我们不能将数据库事务放在后台工作人员中,因为有时工作取决于从数据库中检索到的结果,并且我们希望停止应用程序直到没有获取数据,但在这种情况下,我们也希望在等待表单上显示 gif 图像它的动画。

在这种情况下该怎么做,怎么做。

4

4 回答 4

2

用于BackgroundWorkerSQL taransiction,但Form.Enabled=False在启动之前放置BackgroundWorker,然后Form.Enabled=true放在RunWorkerCompletedBackgroundWorker 的事件上。

这将释放一个主线程来显示 .gif 图片的动画,并在所有数据查询准备好之前停止用户继续工作。

或者,如果.Enabled=false你看起来很难看,你可以创建一个激活/禁用所有主要按钮/控件并阻止用户做事的方法......

或使用方法打开其他表单(使用您的动画 .gif).ShowDialog()。然后从这个表单开始BackgroundWorker并阻止用户在 SQl 事务准备好之前关闭这个“第二个”表单......

于 2013-03-26T07:08:58.677 回答
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 线程,并且需要最少的修改。

于 2013-03-26T07:56:52.457 回答
0

我不完全明白为什么你不能使用Backgroundworker ...

您可以尝试对数据库内容使用关键字 async 和 await ,这样表单就不会冻结。你可以看看这个

于 2013-03-26T06:02:55.723 回答
0

该功能称为加载程序...加载页面时显示需要时间...


加载中...

"


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

于 2013-03-26T06:09:45.753 回答