0

背景: 私は、TooStripStatusLabel として使用される StatusStrip が設定された WindowForms v3.5 アプリケーションを持っています。実行中のタスク中にかなり多くの更新を発行していますが、空白になっている顕著な期間があります。ステータス ストリップ ラベルに空白を書き込んでいる場合もポイントはありません。

質問: ステータス ストリップ ラベルが空白であるとは思わない期間が表示されるのはなぜですか?

更新方法:

    private void UpdateStatusStrip(string text)
    {

        toolStripStatusLabel1.Text = text;
        toolStripStatusLabel1.Invalidate();
        this.Update();
    }

PS。this.Update() の後に Application.DoEvents() を呼び出しても役に立たないようです。私は実際に backgroundworker コントロールを介してこれを呼び出しているので、次のようになります。

(a) バックグラウンド ワーカーを起動します。

    private void Sync_Button_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
        DisableUpdateButtons();
    }

(b) バックグラウンド ワーカーが更新を呼び出します。

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
  backgroundWorker1.ReportProgress(1, "Example string");
  MainForm.MyC.SyncFiles(sender);
}

(c) MyC ビジネスクラスもそれを使用します。

public void SyncFiles(object sender)
{
    BackgroundWorker bgw = (System.ComponentModel.BackgroundWorker) sender;
    bgw.ReportProgress(1, "Starting sync...");
.
.
.
}

(d) このイベントはそれを拾います:

    private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
    {
        UpdateStatusStrip((string)e.UserState);
    }

(e) また、更新ステータス ストリップ

private void UpdateStatusStrip(string text)
{
    toolStripStatusLabel1.Text = text;
    toolStripStatusLabel1.Invalidate();
    this.Update();
}

これは役に立ちますか?

4

1 に答える 1

1

その理由は、この関数の呼び出し元にある可能性があります。別のスレッドから呼び出す場合は、直接呼び出しではなく Control.BeginInvoke を使用してください。長時間の処理中にメイン アプリケーション スレッドから呼び出す場合は、UpdateStatusStrip 呼び出しの後に Application.DoEvents を試してください。

于 2010-03-19T05:31:18.003 に答える