WebサービスのCOMdllを使用しています。COMdllが参照として追加されます。そして、Global.asaxでオブジェクトを静的として宣言しています。Application_StartでCOMオブジェクトを作成しています。
リクエストごとにCOMdllインターフェイス関数を呼び出す必要があります。ここでは、メモリの破損として例外が発生しています。同時リクエストが発生したときに発生するログを確認できました。そのための最善の方法を教えてください。スレッドセーフにする方法。
WebサービスのCOMdllを使用しています。COMdllが参照として追加されます。そして、Global.asaxでオブジェクトを静的として宣言しています。Application_StartでCOMオブジェクトを作成しています。
リクエストごとにCOMdllインターフェイス関数を呼び出す必要があります。ここでは、メモリの破損として例外が発生しています。同時リクエストが発生したときに発生するログを確認できました。そのための最善の方法を教えてください。スレッドセーフにする方法。
COMオブジェクトがアパートメントスレッドの場合、COMは同期を提供して、スレッドごとにメソッドを1回実行します。
ただし、一般的に、COMは、スレッド間で共有される同じポインターを使用してオブジェクトのインスタンスにアクセスしようとする複数のスレッドについて不平を言う必要があります。オブジェクトへのポインタを保持する静的変数を持つことはおそらく悪い考えです。
インスタンスを作成することにより、COMオブジェクト共有ライブラリがどこか(インプロセスまたはアウトオブプロセス)にロードされると、スレッドごとに追加のインスタンスを作成するのはかなり速くなります。つまり、もちろん、オブジェクトの構築中に実行されていることの種類によって異なります。
各リクエストで新しいインスタンスを作成してみてください。オブジェクトのアプリケーション スコープは使用しないでください。
アプリケーション スコープで (Application_Start などを介して) アクセスしている場合は、マルチスレッドに対して安全であることを確認する必要があります。C++ dll がスレッドを処理する方法はわかりませんが、asp.net レベルでマルチスレッドを管理できる可能性があります。
たとえば、単純なアプリケーション レベル カウンターを管理するには、コードは次のようになります。
Application.Lock();
Application["SomeGlobalCounter"] =
(int)Application["SomeGlobalCounter"] + 1;
Application.UnLock();
詳細については、アプリケーションの状態に関する MSDN ページを参照してください。