/ スレッドセーフではないコード用のワーカースレッドプールの作成 - .net、同時実行性、スレッドセーフ、アプリケーションドメイン、ワーカープロセス

スレッドセーフでないコードのためのワーカースレッドプールの構築 - ネット、同時実行性、スレッドセーフ、appdomain、ワーカープロセス

スレッドセーフではないコードを.netフレームワークでラップするための最良の方法は何ですか?

私は「スレッド化されていないサードパーティのライブラリを持っています」静的変数を使用しているため安全です。書き換えることはできません。このライブラリは、asp.net Webサービスによって使用され、同時に多数の呼び出しを受信します。

私は現在、スレッドの安全性を確保するためにロックを使用するプロキシクラスにラップしています。

private static readonly object oneThreadAtATimePlease = new object();
public ISomething CalculateSomething(int someValue)
{
lock (oneThreadAtATimePlease)
{
return new UnsafeLibrary(someValue).DoSomething();
}
}

複数の呼び出し元がロックを待つ必要があるため、パフォーマンスは低下しますが、結果は正しいです。

このライブラリの複数のインスタンスをそれぞれ独自のAppDomainで実行することでパフォーマンスを向上させたいのですが、これは合理的なアプローチですか?推奨する適切なサンプルコードはありますか?

回答:

回答№1は2

キューを使ってメッセージベースのアプリケーションを作成することもできます。

その後、複数のスレッドが要求をキューに入れ、1つのスレッドがこのキューを処理して他のスレッドに結果を通知することができます。 モニタクラスを使用することが常に最速の方法とは限りません。

AppDomainはオプションです。しかし、あなたはIPCに対処しなければならないでしょう。


回答№2の場合は0

静的コンストラクタはあなたを助けます:

静的コンストラクタはアプリケーションドメインごとに一度だけ実行されることが保証されています...


回答№3の場合は0

ワーカーオブジェクトのインスタンスを1つだけ含み、さらにリクエストキューを含むシングルトンについてはどうですか?