0

アプリケーションのステータスを表示するためにWindowsフォームアプリケーションでラベルを使用することは許可/推奨されていませんか?

最初は賢明なアイデアだと思っていましたが、今では表示されないログがたくさんあり、Label.Textの変更にtry/catchを入れないとクラッシュすることがよくあります。これが私が使っている関数です。

private void Echo(string p)
{
    lock (m_syncObject)
    {
        try
        {
            InfoBox.Text = p.ToString();
        }
        catch { }
    }
}

ご覧のとおり、同じリソースへの複数のアクセスにロックを追加しました。なぜ私が頻繁に「キャッチ」に終わるのか誰かが説明できますか?

4

2 に答える 2

3

InfoBox.Text = p.ToString(); ->クロススレッド例外が発生する可能性があります。代わりにこれを試してください:

delegate void myDelegate(ref Label lb, string toAdd);
private void UpdateLabel(ref Label lb, string toAdd)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new myDelegate(UpdateLabel), new object[] { lb, toAdd });
    }
    else
    {
        lb.Text = toAdd;
    }
}
于 2012-11-15T10:02:41.187 に答える
1

.ToString文字列型変数を呼び出す必要はありません。pnullの場合、例外が発生します。あなたは簡単に行うことができます:

private void Echo(string p)
{
    lock (m_syncObject)
    {
        try
        {
            InfoBox.Text = p;
        }
        catch { }
    }
}
于 2012-11-15T09:55:38.337 に答える