0

大規模でかなり複雑な (複数のドキュメント) XML 構造の読み取りと編集に基づく GUI アプリケーションを作成しています。GUI 自体は主にデータ バインディングに基づいているため、XML とのやり取りのほとんどは、内部で LINQ to XML を使用するオブジェクト ベースのモデルを介して UI スレッドで行われますが、一部の操作 (検索やローディング) はバックグラウンド スレッドで実行する必要があるため、この XML にスレッド セーフな方法でアクセスしていることを確認する必要があります。

XMLのすべての編集がスレッドセーフであることを確認するのは簡単です(たとえば、グローバルロックを使用するか、UIスレッドですべての編集を実行することにより)が、XObjectのドキュメントに次のように記載されていることに気付きました

この型の public static メンバーはすべてスレッド セーフです。インスタンス メンバーは、スレッド セーフであるとは限りません。

つまり、アプリケーションで使用されるすべてのインスタンスへのすべてのアクセスを同期する必要あります。残念ながら、私のオブジェクト モデルの動作方法のせいで、モデル内の任意のオブジェクトの最大 1 つのインスタンスが特定の にアクセスできるようにすることは困難です。つまり、プライベート オブジェクトをロックしてスレッド セーフを確保することはできません (通常、デッドロックを防ぐためのベスト プラクティス)。 XObjectXObject

このシナリオではXObject、スレッドセーフのためにそれ自体で直接ロックを使用することは受け入れられますか、それとも代替手段はありますか?

4

1 に答える 1

0

XObject 自体をロックすることはお勧めしません。うまくいくかもしれませんが、一般的には良い解決策ではありません (誰でもできるので)。代わりにできることは、プライベート アノテーションを XObject に追加し、それをロックすることです。自分だけがアクセスできるタイプのオブジェクトを使用して、注釈を非公開にします (アセンブリの内部にあるため)。アノテーションを検索するには、そのタイプを知る必要があるため、タイプが「プライベート」である場合、他の誰もそれを検索できません。

于 2012-08-22T21:08:41.733 に答える