.純PropertyGridスレッドの安全性
-
22-08-2019 - |
質問
してい PropertyGrid
私のアプリが編集に使用する任意のオブジェクト。必要があり走ることができる任意の型別スレッドがもうこれらのオブジェクト(検索機能であれば、奇).を明らかな問題は、そのユーザーが編集のこれらのオブジェクトを同時にあってスレッドが読むことで、好ましくはこんな結果にも重要から検索のスレッドは、読みになります。
呼び出し lock(obj)
はやから検索のスレッドが、その後の文書に簡単な切り取り、削り取りを通じてPropertyDescriptorGridEntryコードは、反射板、せいただくか、類似スポットの利用 System.Threading.Monitor.Enter()/Exit()
のオブジェクトについての質問にPropertyGrid.つくろうと思いましたがBeginEditとEndEditイベントがこの単純な足がないのですが探せないことです。いと思いませんロック全体のオブジェクトでの展示のPropertyGridしていることが明らかに私のブロック検索のスレッドまでの別のオブジェクトを選択しました。
いてはちょっとした新しいスレッドモデルのWindows Forms、今が一部明らかな答えいただきました、見逃されがちです。さい
編集: 同期クローニングは私のオブジェの前に非同期的に検索が効率よく運営できるものとして探しも、予約も、支払も、検索も同時にポイントの走行は非同期的にはもちろんを私のユーザーが仕事を続けながらでも、検索実行.検索に必要な規模のデータセットは私を通じて最終的に終わって任意に大き、同期のクローニングのようにな影響を与えてしまうことにもなりのユーザビリティの問題かに避けなければなりません。
解決
私はあなたがこのために仕事のかなりのビットをしなければならないとしていると思います。
まず、あなたは通常、そのタイプになるだろう何TypeDescriptorにその実装をベースに考えICustomTypeDescriptorの実装を作成する必要があります。
次に、あなたがロックオンするメンバーの記述子を公開するメソッドの実装では、あなたがそれらの記述子から派生するサブクラスを提供し、周りのロックをラップするために適切なメソッドをオーバーライドします。
だから、プロパティのために、あなたがたPropertyDescriptorの特定のサブクラスを返すようにGetPropertiesのを実装します。これらのサブクラスは、GetValueメソッドとSetValueをメソッド(およびその他)をオーバーライドして、これらの変数にアクセスするときにロックを使用することになります。
あなたが任意にそのスレッドでの操作をブロックしたくないので、UIスレッドで、このようにロックすることは、おそらく悪い考えであることに言及しなければなりません。ちょうどオブジェクトのクローンを作成し、作業が完了したときにオブジェクトのストアを更新するメソッドを持っている方がよいかもしれません。
他のヒント
これは確かにスレッドセーフではありません。あなたは、UIスレッドに検索コードのビットをマーシャリングでき、それは、物事を遅くなり、おそらくスレッドのポイントを倒す...
どのように高速検索をする必要がありますか。あなたはクローンに対して動作することはできますか?など
あなたはそれを表示する前にデータのクローンを作成し、検索スレッドがクローンで仕事を得ることができますか?変更を「見る」に検索スレッドが必要な場合は、PropertyGrid
上のイベントに応答して、おそらく何らかの形でクローンをの制御の変更を加えることができます。 (それはちょうどかかわらず、「古い」データを使用する方が簡単でしょう。)
私はデータをクローン知っていることはものすごく非効率的に聞こえるが、各スレッドは完全に独立したデータ(または読み取り専用すべてのスレッドを)上で動作するとき、確かに単純なスレッドます。
をとることができると思いますか間違っていないように思われんら違います。
ある二つの問題に必要なアドレスです。
第一に、うるおいのPropertyGridがみアクセスのUI。する場合、その方法を含む物のゲッター/セン)からアクセスが他のスレッドが、苦痛の不思議なります。この例外は InvokeRequired()
や Invoke
, します。
次に、検索可能なスレッドは正常に動作するはずです。
解決の問題 のいずれか 必要物な変更 を除く UIのスレッド または すべてのイベントをトリガのスレッドを意識なオブジェのイベントなどのPropertyChanged)のみが、UI。
第二の問題はしやすくして検索条件のスレッドだけを読み込みからお客様の中核物、あるべきますよー。あり、スレッドが無意識にも部分的に更新データものではあるんですか?
カップルでの最終思い...
な実施検索に対して繰り返し処理を実行するのPropertyGrid、リストを取得するには、オブジェクトの前にもする必要はなクローン)のようです。
ているアイドル処理の検索?の
Application
オブジェクト火災のイベント時の応用のメッセージプロセスがスクのことを1ステップの検索時にイベントを焼成します。のような貧しい-マンスレッドが、ミューテックス/ロック/semaphoneります。私はこの非常に良い影響を及ぼす。
更新:振り返ってみると、私が正しくPropertyGridを尊重し、 IEditableObject
インタフェースの通話 BeginEdit
の開発にも取り組んでいきま行の変更、 EndEdit
ときに移動。またこのレバレッジを与えるのを防ぐために、検索のスレッドから見て不完全変わります。
更新2:以下、私ただいて分かるようになるのPropertyGrid な を尊重し、IEditableObjectインターフェース。
いう提案もありました。
時を回る。取引の名前空間に導入された。純2.0、私の記事を使用周囲の取引をスレッドの単離のためのオブジェクト。の考えは、あなたのオブジェクトのプロパティとして認可されている。最初に、価値、可視にすべてのスレッドが、スレッド-ローカル変数と使いたい未確定値との間のスレッドベース。場合性が変更され、オブジェクトenlists任意の周囲により取引を格納する新しい価値のスレッドます。の取引犯またはロールの値をスレッドが格納され又は破棄されます。
残念ながら、できないオリジナル記事もどうCSLA提供することです。武器agiは、dexで下がらないboxerぐ.