4

私のC#アプリケーションはシステムの起動時に実行されており、実際に何かができるようになるまでローカルSQLServerインスタンスを待機する必要があります。今のところ、サーバーが応答するのを待ってスピンし(以前はサービスの待機ハンドルを取得していましたが、それは信頼できませんでした)、アプリのメインダイアログを起動します。

もちろん、これに伴う問題は、サービスが開始されるまでユーザーが何が起こっているかを知ることができないことです。また、使用しているハードウェアが原因で、最大1分かかる場合があります。だから私はある種の「読み込み中/お待ちください」インジケーターを投入することを考えています。重要なのは、私たちのプロジェクトは封鎖に近づいており、新しいクラスを作成するのと同じくらい大きな変更は多くの頭痛の種を引き起こすでしょう-既存のファイル(Program.csなど)を変更することは新しいファイルを作成するよりもはるかに邪魔になりません。簡単に言うと、SQL Serverでプリンキングを開始する前に(非同期で)表示し、応答を開始すると削除するのに適した.NETクラスはありますか?

4

4 に答える 4

5

これは、私がすぐにハックしたトリプルスレッドバージョンで、うまくいきます。これは、目に見えるフォームのどこにでもドロップできます (または、program.cs 用に変更できます)。親スレッドで FinishedProcessing が設定されるまで、スムーズにスクロールするプログレス バーを備えた新しい中央のモーダル ダイアログ ボックスが生成されます。真に。

        //Update to true when finished loading or processing
        bool FinishedProcessing = false;  

        System.Threading.AutoResetEvent DialogLoadedFlag
            = new System.Threading.AutoResetEvent(false);  


        (new System.Threading.Thread(()=> {

            Form StockWaitForm = new Form()
            { Name = "StockWaitForm", Text = "Please Wait...", ControlBox = false,
                FormBorderStyle = FormBorderStyle.FixedDialog, StartPosition = FormStartPosition.CenterParent,
                Width = 240, Height = 80, Enabled = true };

            ProgressBar ScrollingBar = new ProgressBar() 
            { Style = ProgressBarStyle.Marquee, Parent = StockWaitForm,
            Dock = DockStyle.Fill, Enabled = true };  

            StockWaitForm.Load += new EventHandler((x, y) =>
            {
                DialogLoadedFlag.Set();
                (new System.Threading.Thread(()=> {
                    while (FinishedProcessing == false) Application.DoEvents();
                    StockWaitForm.Invoke((MethodInvoker)(()=> StockWaitForm.Close()));
                })).Start();

            });  

            this.Invoke((MethodInvoker)(()=>StockWaitForm.ShowDialog(this)));  


        })).Start();  

        while (DialogLoadedFlag.WaitOne(100,true) == false)  Application.DoEvents();     
        //
        //Example Usage
        //Faux Work - Have your local SQL server instance load here
        for (int x = 0; x < 1000000; x++) int y = x + 2;  

        FinishedProcessing = true;

好みに合わせてカスタマイズ。また、本番アプリでこれを使用する場合は、新しいスレッドの内容を try...catch ブロックでCYAにラップします。最後に、このコードを「Coderer Public License / SO v1.1」の下で次のようにリリースします。

Coderer Public License / SO v1.0
コミュニティ「Stack Overflow」で「Coderer」として知られる私は、Executing フェーズで余分なクラスをプロジェクトに追加できる健全なプロジェクト管理方法への切り替えを徹底的に検討することに同意します。ナチスのような変更管理は、関係者全員にとって不健康であることを理解しています。

于 2009-04-01T03:53:27.557 に答える
2

標準の Windows 進行状況ダイアログの .NET ラッパーを次に示します。

http://www.codeproject.com/KB/shell/iprogressdialognet.aspx

私はそれをいじっていませんが、進行状況バーを回転させるフラグがあると確信しています。より凝ったものにしたい場合は、独自の AVI アニメーションを作成してプラグインすることもできます。

于 2009-03-30T19:15:25.547 に答える
1

「お待ちください...」ダイアログを作成するのと同じくらい簡単ですが、理由がわかりません。

私の知る限り、違います。在庫はありません。自分で作成する方がほとんど簡単です...またはフォームを無効にして、砂時計カーソルを表示します。同じアイデアで、実装も同じくらい簡単です。

于 2009-03-30T21:47:52.543 に答える