1

私は、メソッドを実行することだけを目的とした を設計しました。please wait形です。

それにデリゲートを渡して、 を呼び出しますShowDialog。そのデリゲートを受け取り、Shownイベントで実行するだけです。その後、Hide().

目的は、デリゲートが実行されるまで待つようにユーザーに指示することだけです。

BUT:完全に表示される前に、デリゲートの実行を開始します。つまり、フォームは画面に表示されますがplease wait、実行中のコードによってラベルが動かなくなったり、非常に遅く表示されたり、表示されなかったりします。(空の四角形がフォームの中央に残ります)。

デリゲートを実行する前にフォームを 2 秒ほど待機させることもできますが、ラベルが表示された状態で、フォームが完全に描画された後にデリゲートを呼び出す (より適切で確実な) 別の方法はありますか?

ありがとう。

4

1 に答える 1

1

BackgroundWorkerを使用してみる BackgroundWorker コンポーネントには 4 つのイベントがあります。

そのうちの 2 つを実装する必要があります: DoWork と RunWorkerCompleted

DoWork メソッドはスレッドで実行され、そこで作業を行います (または、あなたの場合はデリゲートを呼び出します)。作業が終了すると RunWorkerCompleted が呼び出され、そこで Hide() メソッドを呼び出すことができます。

進行状況を表示したい場合は、ProgressChanged イベントを実装できます。これにより、完了したパーセンテージとオブジェクトを渡すことができます (通常、私は何をしているかについてメッセージを渡します)。

次に、通常どおり Drawing を実行し、バックグラウンド ワーカー RunWorkerAsync を呼び出して呼び出します。

public class Wait : Form
{
    BackgroundWorker _bgWorker = new BackgroundWorker(); 
    public delegate void toExecuteDele(object args); 

    public toExecuteDele ToExecute; 

    public Wait()
    {
        InitializeComponent(); 
        _bgWorker.DoWork += new DoWorkEventHandler( DoWork )
        _bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (WorkDone); 
    }  

    public void Execute(object args)
    {
         // Display Stuff (label, start a progress bar pulsing, maybe enable disable stuff 
            DispalyStuff(" Plate Wait"); 
         _bgWorker.RunBackgroundAsync(args); 
    }

    private void DoWork(object sender, DoWorkEventArgs e)
    {

         if( ToExecute != null )
            ToExecute(e.Argument); 

    }  

    public void WorkDone(object sender, RunWorkerCompletedEventArgs e)
    {  
        // Display an Error if there is an exception in the event args 
        Hide(); 
    }
}

DoWork 内のすべてが別のスレッドで発生し、それ以外はすべて UI スレッドで実行され、実行中にハングアップすることはありません。

于 2013-05-10T19:41:59.210 に答える