0

バックグラウンドでいくつかの作業を実行する方法を説明してthis tutorialいますが、このコードでは、メソッドが呼び出さreading the file...れる前にメッセージが表示されない理由について混乱しています。ReadTheFile(filename)

private void btnSelect_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.CheckFileExists = true;
    ofd.CheckPathExists = true;

    if (ofd.ShowDialog() == DialogResult.OK)
    {
        lblResults.Text = " ... reading the file ...";
        FileReader1 fr = new FileReader1();
        int numLines = fr.ReadTheFile(ofd.FileName);

        lblResults.Text = string.Format("We read {0} lines", numLines.ToString());
    }
}

作者は次のように説明していますが、なかなかうまくいきませんでした。

Worse, even though we set the label’s Text property before we call ReadTheFile, the message loop doesn’t get a chance to process that change, and update the text, before we go out to lunch in ReadTheFile.

これは何を意味するのでしょうか?これはもっと簡単な言葉で説明できますか?

4

2 に答える 2

2

さらに悪いことに、ReadTheFile を呼び出す前にラベルの Text プロパティを設定しても、ReadTheFile でランチに出かける前に、メッセージ ループはその変更を処理してテキストを更新する機会を得られません。

基本的に、ラベルのテキストを設定しています。ただし、その後、数秒、数分、数時間かかる「集中的な」タスクを開始します。ファイルのロードと行数の読み取りを続けている限り、ウィンドウは更新されません。それがバックグラウンド スレッドで実行するポイントです。バックグラウンド スレッドがファイルを処理している間、メイン スレッドがウィンドウの描画と UI 処理を続行できるようにします。

チュートリアルを続けます。バックグラウンドワーカーの作成と実行を開始する部分にたどり着くと、「ああ!」のいずれかになる可能性があります。瞬間。=)

スレッド全般について読むことにも興味があるかもしれません。

http://www.codeproject.com/Articles/26148/Beginners-Guide-to-Threading-in-NET-Part-1-of-n

http://www.techrepublic.com/article/a-beginners-guide-to-threading-in-c/1044970

于 2012-11-22T06:45:51.897 に答える
1

Application.DoEvents Methodを読むことができます。

Windows フォームを実行すると、新しいフォームが作成され、イベントが処理されるまで待機します。フォームがイベントを処理するたびに、そのイベントに関連付けられたすべてのコードが処理されます。他のすべてのイベントはキューで待機します。コードがイベントを処理している間、アプリケーションは応答しません。たとえば、別のウィンドウが上にドラッグされた場合、ウィンドウは再描画されません。

したがって、btnSelect_Click完成するまで、フォームは再描画されません。


私は自分の答えを編集して、DoEvents明示的に使用しない方がよいことに注意してください。かなり奇妙なプログラムの動作になる可能性があります。(J.Skeet のコメントに基づく)。

詳細については、SO での Application.DoEvents() の使用を読むこともできます。そのスレッドに投稿された MSDN からの抜粋があります。

このメソッドを呼び出すと、待機中のすべてのウィンドウ メッセージが処理される間、現在のスレッドが中断されます。メッセージによってイベントがトリガーされる場合、アプリケーション コードの他の領域が実行される可能性があります。これにより、デバッグが困難な予期しない動作がアプリケーションで発生する可能性があります。時間がかかる操作や計算を実行する場合は、多くの場合、それらの操作を新しいスレッドで実行することをお勧めします。

于 2012-11-22T06:51:15.317 に答える