2009-08-04 10 views
1

.NETを使用した新しいWebアプリケーションプロジェクトでは、既存のライブラリ(C#で書かれています)がオンラインで利用可能になり、データモデルの情報に関する計算が実行されます。複数ユーザーの.NET Webアプリケーションで非スレッドセーフなライブラリを使用できますか?

ライブラリーには、同時に多数のユーザーがアクセスする必要があります。すべてのユーザーは異なるデータセットで作業します。ユーザーはモデルデータを修正し、変更された入力パラメータで計算を繰り返すこともできます。

現在、ライブラリは一度に1つのデータモデルしか処理できません。 (静的クラスやシングルトンのような設計上の問題があるとしましょう)。

.NET Webアプリケーション(HTML Webページを使用した単純なWebフロントエンド)がこのライブラリを使用する場合、モデルやその他のパラメータを保持するために、すべてのクライアントに対してライブラリのインスタンスを個別に作成する技術があります分かれている?

+0

あなたのユーザーが同時に異なるモデルデータで作業する必要がありますが、あなたのライブラリーは、一度に1つのモデルデータを扱うことができますか?あなたが言うことは、それが不可能であることを意味します、そのライブラリに静的なクラスだけがありますか?私たちはどんな図書館について話していますか? –

+0

静的なクラスやシングルトンのような設計上の問題があるとすれば、十分迅速に解決することはできません。 – mjn

答えて

1

モジュールを外部からロードし、毎回新しいインスタンスを作成したり、.NET Enterprise Services(COM +)を使用してオブジェクトプーリングを使用することもできますが、オブジェクトがステートフルな場合でもスケーラビリティに問題があります。

コメントあたり:はい、できます。クイックスタートの場合はthis exampleをご覧ください。

+0

COM +オブジェクトプーリングは、非常に興味深いオプションです。 – mjn

+0

ASP.NETアプリケーションでCOM +オブジェクトプーリングを使用できるかどうか知っていますか? – mjn

0

ユーザーがasp.netアプリケーションインスタンス内でシングルトンオブジェクトを共有したい場合は、あらゆる種類のアクセスと変更に対してスレッドセーフで実装する必要があります。

ライブラリのインスタンスを使用および管理するためのラッパーを作成できます。

+0

ライブラリは現在、 'Treat my like a singleton'と言いますが、Webアプリケーションはさまざまな状態のインスタンスを多数作成したいと考えています。基本的な質問は、ライブラリのインスタンスを多数作成し、Webクライアントセッションを1つのライブラリインスタンスにバインドする方法です。 – mjn

0

あなたはロック、例えば:

lock (typeof(YOUR_MODEL_CLASS)) 
{ 
} 

を使用するか、試してみて、キューの計算、データベースファイルにパラメータを保存して実行するサービスを持っており、独自の時間にそれぞれの計算を行うことができます。

これは安定/使用可能なしきい値があります。

+0

モデルの読み込みには数分かかることがあります。完了すると、ユーザーは対話形式で作業する必要があります。キューイング/ロードバランシングは良い考えですが、この場合、クライアント要求とそのデータセットの切り替えには時間がかかります。 – mjn

0

MSDNのように、ほとんどの.NET Frameworkクラスはマルチスレッドアクセス用に作成されていません。

あなたのユーザーは異なるセットのデータを扱うので、あなたのプログラムはすべてのユーザーのためにライブラリ内のクラスのインスタンスを作成する必要があります。

多くのユーザーが同じデータセットで作業する場合は、ライブラリのマルチスレッド機能に注意する必要があります。

+0

静的クラスやシングルトンのような設計上の問題があるため、ユーザーごとにデータモデルインスタンスを作成できないほど迅速に解決できないものとします。 – mjn

0

マルチスレッド環境で安全に設定されていないコンポーネントについては、答えは「はい」です。ただし、コンポーネントへのアクセスを「同期」するメカニズムを選択する必要があります。 C#の最も単純な形式は "ロック"構文です。

一度に1つのインスタンスだけを許可するコンポーネントについて言えば、答えは「いいえ」です。これは、Webアプリケーションが本来マルチスレッド化されているためです。 asp.netでそれを使用すると、通常は悪いことであるコンポーネントが終了するまでサーバー全体をロックする必要があります。 このようなコンポーネントの使用を非同期操作にするのが私の最善の解決策です。ユーザが入力パラメータを指定できるようにしてから、このデータをどこかに保存し、何らかの種類のスケジューラを使用してデータを1つずつ処理します。プロセスが終了したら、作業が完了したことなどをユーザーに通知します。

また、コンポーネントの処理に多くの時間がかかる場合は、ユーザーがコンポーネントと同時に同期しないようにしてください。

+0

これはまさに私が恐れていた答えです:)あなたは非同期処理の利点については正しいですが、ロードされたデータモデルとのやりとりが速いので、最初の初期化に時間がかかるだけです。この問題は、Webアプリケーション全体で一度に1つのモデルしかロードできず、常に初期化が行われる場合、多くのユーザーがモデルを切り替える必要がある場合に開始されます。ライブラリインスタンスにセッションをバインドする、またはライブラリにマルチユーザ機能を追加することはオプションです。 ASP.NETアプリケーションでCOM +オブジェクトプーリングを使用できるかどうか知っていますか? – mjn

+0

できます。しかし実際の問題であるモデルロード時であるため、COM +は各モデルごとに別々のプールを作成できなければ、COM +が何かを解決するかどうかはわかりません。私が正しく覚えていれば、COM +のプールされたインスタンスには状態がないため、実装が不可能な場合があります。 – moin

関連する問題