2013-10-09 13 views
8

私たちには、PDFファイルを生成するために使用されるWCF Webサービス操作があります。私たちは現時点では交換できないサードパーティのツール(特にSyncfusion)を使用しています。WCF webservice - ロックを使用して問題が発生していますか?

サードパーティツールはマルチスレッドに問題があり、同時に複数のWebサービスを呼び出すと動作しない場合があるという問題があります。

我々はlockを使用して、唯一のスレッドがクリティカルセクションを実行することを確認することで、この問題を取り除くことができます。

Public Class GeneratorController 
{ 
    // object we use for lock 
    private static Object thisLock = new Object(); 

    public void Generate(ref PdfDocument pdfDocument) 
    { 
     lock (thisLock) 
     { 
      // critical section 
     } 
    } 
} 

私の質問は以下のとおりです。良いアイデアということでしょうか? Webサービスにそのようなコードがあれば問題は起こりますか?

これはSyncfusionについての質問ではありません。これは、Webサービスでlockを使用することに関する質問です。タグをsyncfusionに変更しないでください。

+0

私はSyncfusionに精通していません - オブジェクトの複数の同時インスタンスを作成することは可能ですか?私はあなたがロックする必要のない別個のインスタンスを持っていると思います。 – Tim

+0

私もそうだけど問題だと思う。たぶん彼らはコード内に何か静的なものを使用しています... – Szymon

答えて

4

WCFは、サービス・オブジェクトの同期呼び出しをサポートし、あなたのニーズに応じて、あなたは次の2つのプロパティを検討することもできます。

第三者コンポーネントの複数のインスタンスを起動できず、コンポーネントがconcを許可しない場合(最悪の場合)、次にInstanceContextMode = Single、およびConcurrencyMode = Singleを指定できます。この場合、WCFはWCFオブジェクトの1つのコピーをインスタンス化します(これはサードパーティコンポーネントのラッパーであると仮定します)。一度に1つの要求のみが処理されます。要求はキューに入れられ、FIFO方式で処理されます。 WCFランタイムはwcfオブジェクトへのアクセスを同期させているので、wcfサービス内でロックを使用する必要はありません。

7

私がここで見る問題は、資源飢餓です。

ロックを囲むFIFOルールはありません。連続負荷がありますのであれば、あなたはこのシナリオを得ることができます:

  • スレッドAロック
  • スレッドロックのC待機
  • スレッドAロックを解除するロック
  • ThreadのB待ちを主張。ロックは任意にスレッドに与えられます。C
  • スレッドDロックを待ちます。今すぐスレッドBDの両方が待っています。
  • スレッドCがロックを解除します。スレッドBが最長で待機していても、ロックはスレッドDに任意に与えられます。

WCF呼び出しがタイムアウトするまで、そしてそれは再現不可能なエラーが発生するまで続きます。

これを実装しなければならない場合は、PDFファイルの生成専用のワーカースレッドが1つ必要です。このスレッドは、サービスが最初に起動するときに起動され、ジョブキューからジョブを取得するのを待ちます。各WCFクエリはこのキューに要求を送信し、ジョブが処理されたことが分かるまでブロックすることができます。

.NET 4.0では、これに役立つBlockingCollectionクラスが用意されています。 (this questionを参照してください)

これは簡単な問題ではないため、完全な解決策がない場合のアプローチです。がんばろう!

+0

あなたの答えをありがとう、それは私が探していた情報の種類です。私たちの場合のプロセスは、まれではありますが、そのような飢えが起こる可能性があります。私はそれを考慮に入れます。 – Szymon

0

必須のPDFはスレッドセーフなコンポーネント であるため、PDFドキュメントをマルチスレッド状態で作成することができます。あなたは解決策を得るためにDirect-Trac事件を作成してください。

+0

さて、私たちはまだSyncfusionから適切に機能するバージョンを手に入れようと努力しているので、それは本当ではありません。 – Szymon

関連する問題