2011-12-14 1 views
2

ASP.Net/C#からC++アンマネージドコードを呼び出すコードの一部を同時に実行できないようにするという制約を付けるように求められましたウェブアプリケーション。一度に1人のコードしか実行できないようにする方法

PInvoke/C++コードを呼び出すC#クラスライブラリにあるC#コードの周りにlock(someobject)を配置すれば、1人のユーザーしかコードを実行できないようにすることができますか?または別のテクニックがありますか?

このコードをWCFサービスとしてホストする必要があります。このアプローチもうまくいくのだろうか?

+0

このリンクを参照してくださいhttp://stackoverflow.com/questions/3013212/how-to-find-that-mutex-in-c-sharp-is-acquired –

+0

私は、同期やその他のロックメカニズム –

+0

リソースにアクセスするAppDomainが1つある場合、スタティックロックはジョブを実行します –

答えて

5

WCFを使用する場合、ConcurrencyMode.Singleを採用することができます。これにより、1つのコンテキストインスタンス内の任意の時点で、1つのスレッドだけが自動的に操作を実行することが自動的に保証されます。

それ以外の場合は、手動スレッドの同期化(ロック、ミューテックスなど)を行う必要があります。

+0

また、手動スレッド同期を使用する場合、ロック/ミューテックスはすべての要求によって共有されるように静的にする必要があります。さもなければ、彼らはそれぞれ独自のロックのコピーを取得し、同時に実行できます。 – GalacticCowboy

+0

WCFサービス上でConcurrencyMode.SingleをPer Call(コンテキストモード)サービスで設定すると、WCFサービスへの複数のクライアント呼び出しは同時に実行されません。 – InfoLearner

+0

@KnowledgeSeekerあなたが正しいです、インスタンスコンテキストモードは単一でなければなりません。私は自分の答えを更新しました。 – oleksii

0

そのコードが実行されている間に変数にlock()を配置することは、ひとつの方法です。

An article by Joe Albahariは、おそらくあなたのシステムに最適な方法についてのアドバイスを提供します。

もう1つのSOの投稿もあります:Can I add an attribute to a function to prevent reentry?あなたにも役立つかもしれません。

これまで私は[MethodImpl(MethodImplOptions.NoInlining)]を使用していました(MSDNを参照してください) そして、それは同期動作ではうまく機能しました。

関連する問題