0

私はC#4.0 WinFormアプリケーションに取り組んでいます。これらは実際には会計関連のアプリケーションであり、主な機能はデータベースにデータを保存して取得することです。

SqlServer 2008 r2 Express を使用したバックエンド。

問題は、データベースでコマンドを実行するときに数秒かかることです。その時点で、アプリケーションのメイン ウィンドウが停止します。

データベースでコマンドを実行すると、コマンド全体がデータベースで実行されると、メインアプリケーションで実行が返されます。

「NonQuery()」のように

そのため、フォームの前にフォームを表示し、コマンドの後にそのフォームを閉じていますが、メインアプリケーションで実行が停止しているため、フォームにGIF画像を配置しているため、コマンドが実行されるまでgifはアニメーションを表示しません.

私はそれをBackGroundWorkerに入れましたが、メインスレッドが停止しているため、その子スレッドも停止します。

データベース トランザクションをバックグラウンド ワーカーに入れることはできません。これは、データベースから取得した結果に依存する場合があるためです。また、データがフェッチされなくなるまでアプリケーションを停止したいのですが、この場合も待機フォームで gif 画像が表示されるようにする必要があります。そのアニメーション。

この場合、何をすべきか、どのようにすべきか。

4

4 に答える 4

2

BackgroundWorkerSQL トランザクションに使用しますが、BackgroundWorker のForm.Enabled=False開始前BackgroundWorkerとイベント時に配置Form.Enabled=trueします。RunWorkerCompleted

これにより、.gif 画像のアニメーションを表示するためのメイン スレッドが解放され、すべてのデータ クエリの準備が整う前にユーザーが作業を続行できなくなります。

または、.Enabled=false見苦しい場合は、すべてのメイン ボタン/コントロールをアクティブ化/無効化し、ユーザーの操作を停止するメソッドを作成できます...

または、メソッドを使用して他のフォーム (アニメーション化された .gif を含む) を開きます.ShowDialog()。そして、このフォームから開始し、BackgroundWorkerSQl トランザクションの準備が整う前に、ユーザーがこの「2 番目の」フォームを閉じないようにします...

于 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

ローダーと呼ばれるその機能...ページの読み込みに時間がかかるときに表示される...


読み込んでいます...

"


 <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 に答える
0

Backgroundworker を使用できない理由がよくわかりません...

フォームがフリーズしないように、キーワード async を使用してデータベースのものを待つことができます。あなたはこれを見ることができます

于 2013-03-26T06:02:55.723 に答える