2

メイン フォームが長いタスクを実行している間、「しばらくお待ちください」というメッセージ ボックスを表示したいと考えています。私の場合、時間のかかる作業はシリアル プロトコルの送信です。以下は私のコードです:

public void transmitprotocol()
{    
    try
    {
         MessageBox.Show("Please wait. Uploading logo.", "Status");

         // Transmitting protocol coding here. Takes around 2 minutes to finish.

    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.ToString());
    }
}

上記のコーディングのように MessageBox を使用して上記の方法を試しましたが、プロトコルの送信を開始するだけで常に MessageBox を閉じる必要があります。プロトコルを送信している間、「お待ちください」メッセージボックスを表示する方法はありますか?

4

3 に答える 3

9

バックグラウンド スレッドで高価な操作を行う必要があります。そのためには、BackgroundWorkerまたは新しい並列化ライブラリ (.NET 4 など) を使用します。

実際には、ダイアログを閉じるまで実行がブロックされるため、ダイアログを閉じる必要があります。操作を開始してからダイアログを表示し、操作が完了したらダイアログを閉じます。

ここで、WPF を使用している場合は、ダイアログ ボックスを使用せず、代わりにBusy Indicatorを使用することを強くお勧めします。これは無料で、非常に使いやすく、メッセージ ボックスほど見苦しくありません。

編集: WinForms を使用していることを指定したので、背景が機能するように実装します。なぜなら、ビジー ラベルを表示する目的のクロムのない透明なウィンドウを実装するからです。バックグラウンド ワーカーが終了したら、そのウィンドウを閉じます。

ここに画像の説明を入力

于 2012-09-20T03:39:47.910 に答える
6

バックグラウンドワーカーを準備し、MessageBoxの代わりにWindowsフォームを使用する必要があります。コピー/貼り付けのような単純なもの:

    Form1 msgForm;
    public void transmitprotocol()
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        //you can use progresschange in order change waiting message while background working
        msgForm = new Form1();//set lable and your waiting text in this form
        try
        {
            bw.RunWorkerAsync();//this will run all Transmitting protocol coding at background thread

            //MessageBox.Show("Please wait. Uploading logo.", "Status");
            msgForm.ShowDialog();//use controlable form instead of poor MessageBox
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
        }
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        // Transmitting protocol coding here. Takes around 2 minutes to finish. 
        //you have to write down your Transmitting codes here
        ...

        //The following code is just for loading time simulation and you can remove it later. 
        System.Threading.Thread.Sleep(5*1000); //this code take 5 seconds to be passed
    }
    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //all background work has complete and we are going to close the waiting message
        msgForm.Close();
    }
于 2012-09-20T05:36:11.913 に答える