別のフォームのコントロールのコントロールのプロパティを設定している PropertyGrid があります。ただし、「場所」や「テキスト」などについては、クロススレッドの問題が発生します。
プロパティ グリッドでこれらのプロパティの設定を安全に (AllowIlligalCrossThread=true を使用せずに) 行う簡単な方法はありますか?
ありがとう。
別のフォームのコントロールのコントロールのプロパティを設定している PropertyGrid があります。ただし、「場所」や「テキスト」などについては、クロススレッドの問題が発生します。
プロパティ グリッドでこれらのプロパティの設定を安全に (AllowIlligalCrossThread=true を使用せずに) 行う簡単な方法はありますか?
ありがとう。
プロパティをオーバーライドし、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 フォームを作成していますか?