0

別のフォームのコントロールのコントロールのプロパティを設定している PropertyGrid があります。ただし、「場所」や「テキスト」などについては、クロススレッドの問題が発生します。

プロパティ グリッドでこれらのプロパティの設定を安全に (AllowIlligalCrossThread=true を使用せずに) 行う簡単な方法はありますか?

ありがとう。

4

1 に答える 1

0

プロパティをオーバーライドし、Invoke を使用して「スレッドセーフ」な方法でプロパティを設定する派生サブクラスを作成できます。

class DerivedLabel : Label
{

    public override string Text
    {
        get
        {
            return Invoke(new Func<string>(GetText)) as string;
        }
        set
        {
            Invoke(new Action<string>(SetText), value);
        }
    }

    private void SetText(string text)
    {
        base.Text = text;
    }

    private string GetText()
    {
        return base.Text;
    }

}

Invoke() は、コントロールを作成したのと同じスレッドで渡すデリゲートを実行するため、暗黙的にスレッドセーフです。ただし、サブクラス化する必要があるコントロールが多数ある場合、これは大変な作業になる可能性があります。

スレッド化の問題が発生する理由を理解することは、おそらく時間の価値があるでしょう.両方のコントロールが同じスレッドで作成されている場合 (Windows アプリでは通常のことです)、これらの例外は発生しないはずです. 何らかの理由で別のスレッドで PropertyGrid フォームを作成していますか?

于 2009-10-11T00:59:57.540 に答える