2

私のアプリケーションは C# Windows フォーム アプリケーションです。ユーザーが「生成」ボタンを押すと、私のアプリケーションは新しいスレッドを作成し、新しいプロセスを実行します。プロセスは以下の疑似コードのようになります

Loop counter = 1 to N 
    progressbar = counter/N
    Display msg on label1
    Do some tasks
Loop
progressbar = 100%
Display msg on lable1

プロセスバーとラベルのメッセージを委任しました。メッセージはループ内にあるときに問題なく表示されます。ラベルのテキストが変更されるたびに Application.DoEvents() を実行するイベントを追加しましたが、最後のメッセージは決して表示されません。最後のメッセージ ラベルの直後に Application.DoEvents() を配置しようとしましたが、解決策はありません。他の誰かがこれに遭遇しましたか?

みんな助けてくれてありがとう!

編集

これは私が最後のメッセージをコーディングした方法です(ループの後のもの)

        this.BeginInvoke((MethodInvoker)delegate()
        {
            toolStripProgressBar1.Value = 100;
            btnCancel.Enabled = false;
            btnBrowse.Enabled = true;
            btnSaveTo.Enabled = true;
            btnGenerate.Enabled = false;
            // Performance testing
            lblGeneratingInfo.Text = "Generation Complete! Total Run time: " + DateTime.Now.Subtract(startDate).ToString();
        });

修正済み: 表示しようとしたテキストが長すぎると思います...「Generating Complete: Total run time」を「Run time:」だけに置き換えたところ、o_o と表示されました

4

2 に答える 2

2

ReportProgress() を使用して、進行状況を伝える BackgroundWorker を使用することができます。

このbackgroundWorkerチュートリアルを見てください

UI の更新は、ReportProgress() によって呼び出されるメソッドでのみ発生する必要があります。

于 2010-06-28T12:14:04.297 に答える
1

これはすべて新しいスレッドで発生すると述べています。ただし、あなたも言及していDoEventsます。私には、これは問題になるワーカー スレッドから UI を更新していることを示唆しています (もう 1 つの可能性は、ワーカー スレッドで実行しているが、UI スレッドをブロックしていることです。これも問題です)。

UIスレッドでUI自体を更新するようにUIに依頼する必要があります-その後は必要あり ませんDoEvents

/* on worker thread */
string text = ...
int progress = ...
this.Invoke((MethodInvoker)delegate { /* on UI thread */
    label1.Text = text;
    progressBar.Value = progress;
});
/* on worker thread */
于 2010-06-28T12:15:17.567 に答える