私は並行性について調べ、より「スレッドセーフ」な観点から物事を見てきました。WPF (または実際には System.Windows.Freezable など) には、「アイスキャンディーの不変性」を与えることができるフリーズ可能なクラスがあります。誰かがこれを WPF/Silverlight の外で使用しようとしたことがありますか? 私はそこにいくつかの良いものがあることを知っています。
2 に答える
WPF 以外の System.Windows で Freezable 型を使用しないでください。
その理由は、WindowBase.dll (または Freezable が定義されている場所) への依存関係を作成するためです。また、このような参照は、UI に直接アクセスできない「モデル プロジェクト」に存在するべきではありません。
ただし、独自の Freezable 基本クラスを簡単にコーディングできます。
複雑な開始 (循環参照) を必要とするスレッドセーフ オブジェクトを作成するアプリケーションで、次のインターフェイスを使用しました。
public interface IFreezable
{
bool CanFreeze
{
get;
}
bool IsFrozen
{
get;
}
void Freeze();
}
CanFreeze プロパティに注意してください。フリーズする前に Freezables を検証したかったので、これを使用することにしました。クライアントにそうする機会を与えないことは、私の意見では良くありません。
Freezables の概念は、IMO であり、マルチスレッド アプリケーションのツール パレットを充実させる優れたアイデアです。
必要に応じて、Freezable やその他のディスパッチャ/依存オブジェクトを自由に使用してください。WindowsBase.dll を参照することは、GDI32.DLL をヘッドレス サーバー プログラムにロードすることと何ら変わりはありません (これらはすべて実行しなければなりません)。考慮する必要がある唯一のことは、DispatcherObject は Windows メッセージ ループを中心としており、コードがイベント ドリブンであり、オブジェクトが Dispatcher イベント ループを持つスレッド上に存在しない限り、最小限のメリットしかないインフラストラクチャを提供するということです。しかし、そうであれば、ネイティブ オブジェクトをスレッド アフィニティを使用して DispatcherObject 派生物内にラップすることで、設計の明確さと柔軟性を大幅に得ることができます (私はこれを ESENT で非常に効果的に実行しました)。それはすべて、あなたがどれだけ箱の外で考えようとしているかにかかっています.