2012-03-12 20 views
2

以下、WCFサービス/クライアントセットアップの概要を説明しました。単一のクライアントがIWCFService.Processを複数回連続して呼び出すと、WCFService.Processとthis.Subscribers.ProcessingCompletedを実行するWCFService.Runの間のデッドロックが発生します。WCFサービスがデッドロックしています

クラスWCFServiceのインスタンスがServiceHostコンストラクタに渡され、WCFServiceの実行APIがQueueUserWorkItemを使用して作成されたスレッドからコールバックされます。私は、WCFがWCFService.Processを呼び出すために使用するスレッドと、WCFService.Runというスレッドが実行中のスレッドとの間で競合が発生していると推測しています。

私は1000のMaxConcurrentSessionsと1000のMaxConcurrentCallsを許可するServiceThrottlingBehaviorを既に追加しました。このデッドロックを防ぐサービスクラスまたはクライアントクラスに属性を追加できますか?

[ServiceContract(Name = "IWCFClient")] 
public interface IWCFClient 
{ 
    [OperationContract] 
    void ProcessingCompleted(Guid guid); 
} 

[ServiceContract(Name = "IWCFService", CallbackContract = typeof(IWCFClient))] 
public interface IWCFService 
{ 
    [OperationContract] 
    Guid Process(string filename); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
class WCFService : IWCFService, WFGenericThread<WFProcessingResult>, 
{ 
    public Dictionary<Guid, IWCFClient> Subscribers { get; set; } 
    public override void Run(WFProcessingResult queueobj) 
    { 
    if(this.Subscribers.ContainsKey(queueobj.Guid)) 
     this.Subscribers.ProcessingCompleted(queueobj.Guid); 
    } 

    public Guid Process(string filename) 
    { 
    Subscribers.Add(guid, (IWCFClient)OperationContext.Current.GetCallbackChannel<IWCFClient>()); 
    // send filename off to be processed 
    } 
} 

答えて

1

サーバーはスレッドセーフではありません。

InstanceContextMode = InstanceContextMode.Singleは、WCFがマルチスレッドアクセスを適切に防止していることを意味しますが、バックグラウンドでのスレッドプールの使用には同じ制限がありません。

サーバーをスレッドセーフにするか、スレッドプールを使用しないでください。

ここはいいintroductory article on multi-threadingです。

+0

それぞれのメソッドをロック(これ)でラップすると仮定しても、それは動作しませんでした。 \t \t [MethodImpl(MethodImplOptions.Synchronized)] – user481779

+0

スレッドプールの使用によって問題が発生するため、この問題を解決できる属性はありません。 –

+0

実行と処理の最上部にロックを挿入すると、デッドロックが発生します。ここで問題になっているスレッドプールを私が使用しているかどうかはわかりません。 – user481779

関連する問題