私のアプリケーションにはPropertyGrid
があり、これは任意のオブジェクトの編集に使用されています。私はこれらのオブジェクト(検索機能、あなたが好奇心が強い場合)を見る別のスレッドで任意のサブルーチンを実行できる必要があります。明白な問題は、ユーザーがこれらのオブジェクトの1つを、検索スレッドが読み取っているときに同時に編集している可能性があります。これは避ける方が望ましいでしょう(ただし、検索スレッドが読んでいるだけなので、書きません)。 lock(obj)
を呼び出す.Net PropertyGridスレッドセーフ
は私の検索スレッドから十分に簡単ですが、リフレクターでPropertyDescriptorGridEntryのコードを文書化し、簡単にスキムミルクを見た後、私は上の問題のオブジェクトにSystem.Threading.Monitor.Enter()/Exit()
コールを使用する類似点を見つけるように見えることはできませんPropertyGrid。私はBeginEditイベントとEndEditイベントがあり、これを簡単にすることができればと思っていましたが、そのようなことは見つけられません。オブジェクト全体がロックされていないのは、PropertyGridに表示されている間にオブジェクト全体をロックしたくないからです。別のオブジェクトが選択されるまで、検索スレッドをブロックすることになります。
私はWindowsフォームのスレッドモデルに少し新しかったので、私は見落としてしまった明らかな答えがあることを期待しています。どんな助け?
編集:が同期非同期検索を実行する前に、私のオブジェクトを複製するには、おそらく私も同期の検索自体を実行する可能性があることを十分に非効率的になります - 非同期で実行されているのポイントはもちろんである私のユーザーがしばらく作業を継続できるようにします検索が実行されています。私が行っているデータセットは最終的には任意の大きさになるため、同期クローニングは避けようとしているユーザビリティの問題を引き起こすように見えるため、検索のスケールが必要です。
を台無しにしてしまう同期クローニング、 PropertyGridの場合、PropertyTabをサブクラス化してGetPropertiesをオーバーライドすることで、より簡単に行うことができます。仕事はまだ**たくさんありますが、実際にはICustomTypeDescriptor(TypeDescriptionProvider)経由でシムする必要はありません –
@Marc Gravell:You PropertyDescriptorから派生し、GetValueとSetValueをオーバーライドして示したことを行うサブクラスを作成する必要がありますが、これはほぼ同じ量ですが、ICustomTypeDescriptor実装の一般的な使用があります。 – casperOne
しかし、ICustomTypeDescriptorでは、グリッドだけでなく、表示されているタイプを制御する必要があります。 –