获取List<;的索引超出范围错误;T>;同时进行负载测试.这似乎是线程问题

本文关键字:负载 测试 似乎是 问题 线程 索引 lt List 获取 错误 范围 | 更新日期: 2023-09-27 18:26:23

在我们的应用程序中,我们接收一个集合(List)作为WCF Web方法的输入参数,该输入参数按原样传递给StaticClass.StaticMethod,而不传递给任何本地成员。在静态方法内部,第一行检查输入参数List的计数是否大于零,下一行我正在检索第一个元素(第0个索引),但在使用loadrunner测试此应用程序时,它抛出了"index out of range"错误。乍一看,这似乎是一个简单的竞赛条件,但负载运行者通过网站访问此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; }
    }

获取List<;的索引超出范围错误;T>;同时进行负载测试.这似乎是线程问题

我来看看调用方法是如何使用列表的。很容易说:

var balances = GetCashBalances(_someList);

其中CCD_ 1是被各种不同方法消耗的某个静态字段。如果有任何东西从_someList中删除了一个元素,那么您很容易出现所报告的问题。

看看这是否有帮助:

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