Ошибка индексации вне диапазона для списка <T>при нагрузочном тестировании. Кажется, это проблема с потоками - PullRequest
0 голосов
/ 02 марта 2012

В нашем приложении мы получаем коллекцию (List) в качестве входного параметра для веб-метода WCF, и этот входной параметр передается как есть, без передачи в какой-либо локальный член, в StaticClass.StaticMethod.Внутри статического метода в первой строке проверяется, что счетчик входного параметра List больше нуля, а в следующей строке я получаю первый элемент (0-й индекс), но при тестировании этого приложения выдается ошибка «Index вне диапазона».используя груз бегун.На первый взгляд это выглядит как простое состояние гонки, но загрузчик получает доступ к этой службе WCF через веб-сайт, и веб-сайт никак не может передать пустую коллекцию.Есть мысли?

// 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;
}

Подробная информация об объекте запроса

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

1 Ответ

2 голосов
/ 02 марта 2012

Я бы посмотрел, как список используется , вызывающим метод.Было бы довольно легко сказать:

var balances = GetCashBalances(_someList);

... где _someList - это статическое поле, которое используется различными способами.Если что-то удаляет элемент из _someList, вы можете столкнуться с проблемой, о которой сообщаете.

Посмотрите, поможет ли это:

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