1

メソッドの一部を同期したい。lock(this) を試してみましたが、ログを観察したところ、一度に 2 つのリクエストが処理されているため処理できなかったので、一度に 1 つのリクエストのみを処理したいと考えています。

これを実装する方法を教えてください。

次のコードを試しました。

  lock (this)
   {

  obj.ConvertFile(inputFilename, outputFullPath, null, batchProcess,   null);

   }

しかし、それは私にとってはうまくいきませんでした。だから私は lock() で静的変数を作成しました

  lock (this)
   {
    i++;               
  obj.ConvertFile(inputFilename, outputFullPath, null, batchProcess,   null);

   }

これも私にとってはうまくいきませんでした。

2 つ以上のリクエストが受信されたときに、一度に 1 つのリクエストのみが処理されるように同期を実装する方法を教えてください。

4

1 に答える 1

0

ASP.NET Web サービス (1 つのプロセス内で複数のスレッドを実行する) をロックしたい場合は、同期しないでください(クラスとはthis何かを推測しているだけですが)。this

次のオブジェクトをロック オブジェクトとして使用できます。これは静的であるため、クラスのすべてのインスタンスで共有されます。

private static Object thisLock = new Object();

それを使用してロックします

lock(thisLock) 
{
}

MSDNから:

一般に、パブリック型、またはコードの制御を超えたインスタンスのロックは避けてください。一般的な構成要素 lock (this)、lock (typeof (MyType))、および lock ("myLock") は、次のガイドラインに違反しています。

  • ロック (これ) は、インスタンスがパブリックにアクセスできる場合に問題になります。

  • lock (typeof (MyType)) は、MyType が公開されている場合に問題になります。

  • 同じ文字列を使用するプロセス内の他のコードは同じロックを共有するため、lock("myLock") は問題です。

ベスト プラクティスは、プライベート オブジェクトを定義してロックするか、プライベートな静的オブジェクト変数を定義して、すべてのインスタンスに共通のデータを保護することです。

于 2013-11-14T05:25:39.430 に答える