2012-03-02 6 views
0

アプリケーションでは、WCF Webメソッドへの入力パラメータとしてコレクション(List)を受け取りました。その入力パラメータは、ローカルメンバーには転送されずにStaticClassに渡されます。StaticMethod 。静的メソッド内で、最初の行は、入力パラメータListの数がゼロより大きく、次の行が最初の要素(0番目のインデックス)を取得していることを確認しますが、このアプリケーションがテストされている間ロードランナを使用します。 一見、単純な競合状態のように見えますが、ロードランナーはこのWCFサービスにWebサイト経由でアクセスし、空のコレクションを渡すことはできません。 考えていますか?私はどのようにリストを見てみたい負荷テスト中にリスト<T>の範囲外のインデックスを取得するとエラーが発生します。スレッドの問題のようです

[DataContract] 
public class RequestToWCFService : BaseRequest 
    { 
     [DataMember] 
     public List<AccountGroup> _someList { get; set; } 
    } 
+0

は、この状態(特にパラメータ)のいずれかが別の要求の間で共有されていますか? –

+0

はい、ルートメソッドから2つのメソッドに同期して渡されます。私が他の答えで述べたように、私が行っている並列スレッド/非同期呼び出しはありません。 –

答えて

2

Requestオブジェクトに関する

// Code snippet 
public static List<X> GetCashBalances(List<Y> IPReceivedAtWebMethod) 
{ 
    List<X> list = new List<X>(); 
    if IPReceivedAtWebMethod== null) return list; 
    if IPReceivedAtWebMethod.Count <= 0) return list; 
    // The below line throws Index out of range error. 
     SomeValue s = AdminHelper.GetSomeValue(IPReceivedAtWebMethod[0].member1); 
    // … 
} 
上記のメソッドを呼び出すWCFサービスメソッドは、参照のために以下の通りです

public class CashService : ICashService 
{ 
public ServiceResponse GenerateCashBalances(RequestToWCFService request) 
{ 
    ServiceResponse response = DataContractFactory.InstanceOfServiceResponse(); 
    try 
    { 
     // This is the code calling the method I referred in the question which is throwing Index out of range Error 
     response._someList = StaticClass.GetCashBalancesReferredInQuestion(request._someList); 
     // I hope this would not do any harm to _someList 
     List<CashBalance> list = response._someList.ConvertAll(c => (CashBalance)c); 

     // Second call using the same collection however the list is not alterned inside this method too. 
     response.someActivity = AdminController.GetActivity(request._someList).ToString("O"); 
     response.ResponseCode = WcfServiceCodes.OK_RESPONSE; 
    } 
    catch (Exception ex) 
    { 
     // log error 
    } 
    return response; 
} 

詳細メソッドを呼び出すことによって使用されています。言うのは非常に簡単になるだろう:_someListが異なる様々な方法で消費されますどこかの静的フィールドである

var balances = GetCashBalances(_someList); 

...。何かが _someListから要素を削除した場合は、報告している問題が発生しがちです。この場合に役立ちます

参照:

var list = _someList.ToList(); // create a local copy. 
var balances = GetCashBalances(list); 
+0

うん、ここでのポイントは 'とその入力パラメータは、任意のローカルメンバに転送せずにそのまま渡されます'です。 – Tudor

+0

あなたが提案したのと同じことを試したいと思います。しかし、私はこの問題を理解しようとしています。ローカルコピーを作成する必要はありますか?それは、WCFサービスメソッドで受け取った入力パラメータがスレッドセーフではないことを意味しますか?言い換えれば、他のスレッドがそれを変更する可能性はありますか? WCFサービスメソッドはインスタンスメソッドであり、パラメータは保持されていると仮定します。 –

+0

@ MakR:通常、WCFサービスメソッドに渡されるパラメータは、指定されたRequestに対して特別に作成されます。 Webサービスがこのメソッドを呼び出す方法に関する詳細情報を提供できますか?このリクエスト内で並列処理を行いますか? – StriplingWarrior

関連する問題