1

これは、しばらくの間表示されるステータスメッセージを利用するための最良の方法ですか?

private void SetStatus(Color _color, string _msg)
{
    System.Threading.Thread t = new System.Threading.Thread(() =>
    {
        stsStatusMsg.ForeColor = _color;
        stsStatusMsg.Text = _msg;
        System.Threading.Thread.Sleep(2000);
        stsStatusMsg.Text = "";
    });
    t.Start();
}

それを呼び出す例:

SetStatus(Color.Red, AppMessages["msgALREADYIN"]);

stsStatusMsg(これはToolStripStatusLabel)は、アプリケーション操作全体を通してこのメ​​ソッドによってのみアクセスされます。

上記のコードは実際に機能します。メッセージはコントロールに2秒間表示され、その後消えます...

4

1 に答える 1

5

これがWinFormsにある場合、私が思うに、これは機能しない可能性があります。UIコントロールへのアクセスは、メインウィンドウのメッセージスレッドからのみ許可されています。このスレッドにはInvoke、コントロールでを使用してアクセスできます。更新します。コードは機能しますが、これは、スレッドから操作している実際のオブジェクトがControl-一般にWinFormsでは、クロススレッドアクセスが許可されていないためです。

また、各ステータスの新しいスレッドはやり過ぎのようです。はい、スレッドはある時点でGCによって破棄される予定ですが、スレッドは作成するのにコストのかかるリソースであり、コードはステータスの変更ごとに1つ作成します。より良いアプローチは、組み込みのスレッドプール(フレームワークによって管理されるプールから長寿命のスレッドの処理時間を取得する)を使用するか、Timer指定された間隔でコードを実行するように設計されたを使用することです。

テキストを変更し、タイマーを使用して、希望の時間の後に再び非表示にするのはどうですか?

Timerこれが:を使用した解決策です。

private void SetStatus(Color _color, string _msg)
{
    stsStatusMsg.ForeColor = _color;
    stsStatusMsg.Text = _msg;
    timer.Start();
}

private void StatusTimer_Elapsed(object sender, EventArgs e)
{
    stsStatusMsg.Text = "";
    timer.Stop();
}

上記のコードは、タイマーがすでに作成されており、イベントがTickイベントに接続されていることを前提としていStatusTimer_Elapsedます。System.Windows.Forms.Timerこのクラスがこれに適している理由は、タイマーイベントがUIスレッドで発生するためです。つまり、コントロールへのクロススレッドアクセスについて心配する必要はありません。

免責事項:コンパイラを使用せずに上記のサンプルを考えただけなので、微調整が必​​要な場合があります。

于 2012-07-07T09:40:09.443 に答える