问题描述
|
前一段时间,我编写了一个用于收集公共交通中断的系统的代码。有关任何事件的信息都收集在MSsql数据库中。消费者通过调用.asmx Web服务来访问这些数据。使用ADO.NET从数据库收集数据,然后每个数据行填充一个Deviation对象并添加到List。在服务层中,将对列表应用ToArray()调用并将其返回给使用者。
到目前为止,一切都很好。但是问题在于,在某些情况下(5%左右),我们已经知道该数组会以某种方式被缩减。而不是通常的15-20个项目,而是返回了一半甚至更少的项目。其余项目始终位于原始列表的末尾。而且,甚至更少的时间,在数组的开头重复/随机排列了几项。
在不同的层上进行了一些测试之后,缩减似乎发生在过程的最后,即在转换为数组或SOAP序列化期间。但是代码看起来很纯真,是吧?:
[WebMethod]
public Deviation[] GetDeviationsByTimeInterval(DateTime from,DateTime to)
{
return DeviRoutines.GetDeviationsByTimeInterval(from,to).ToArray();
}
我不是100%肯定不会在sql或数据访问层中发生错误,但是事实证明他们在测试过程中发挥了作用。在这个问题上的任何帮助都会有很大帮助! :)
解决方法
我会做类似的事情:
public Deviation[] GetDeviationsByTimeInterval(DateTime from,DateTime to)
{
var v1 = DeviRoutines.GetDeviationsByTimeInterval(from,to);
LogMe( \"v1: \" + v1.Count );
var v2 = v1.ToArray();
LogMe( \"v2: \" + v2.Length );
return v2;
}
证明您期望的结果通常会得到回报:-)
, http://msdn.microsoft.com/zh-CN/library/x303t819.aspx
类型:T []包含副本的数组
列表中的元素。
您没有在.NET中找到错误,这很可能是您的ѭ2中的错误
, 我愿意打赌ToArray
确实按照所告诉的去做,但是您的from
或to
值有时会是垃圾(验证错误?)或GetDeviationsByTimeInterval
出于某种原因会误解它们。
将一些日志记录到Deviation[]
和GetDeviationsByTimeInterval
中,以查看传递给它的是什么值,下次它变成梨形时,您将能够诊断问题出在哪里。