何时来自WCF呼叫分配的内存?

时间:2010-10-19 15:11:52

标签: c# .net wcf

我调用了一个返回大量数据的SOAP WCF服务。不仅仅是调用Windows Mobile设备可以处理。

但我注意到一些奇怪的事情。当我拨打电话时,它看起来像这样:

MyContract[] myContractArray = MyService.CallToGetLotsOfDataObjects();

这不会失败。但是当它遍历myContractArray并将它们放入客户端类时,它就会失败。

起初我只是说,“好吧,它无法处理两份数据,这太多了”。但现在我想知道myContractArray实际上是否在上述调用之后持有数据。我想知道它是否有点像Linq-To-SQL调用,在需要之前它不会被加载。

所以这是我的问题,以下几点是在客户端分配数据?

// Create the service 
var serviceLib = new MyServiceDataServiceLib();

//                           1 -----------------+                      
//                                              |                      
//                                              V 
MyContract[] myContractArray = serviceLib.WCFCallToGetLotsOfDataObjects();  
List<MyClass> myClassList = new List<MyClass>()

// 3 -----------------+                       +------------------ 2
//                    |                       |
//                    V                       v
foreach(MyContract myContractInstance in myContractArray )
{
   MyClass myClassInstance = new MyClass();
   myClassInstance.BigImage = myContractInstance.BigImage;
   myClassInstance.MoreData = myContractInstance.MoreData;
   myClassInstance.EvenMoreData = myContractInstance.EvenMoreData;
   myClassList.Add(myClassInstance);
}

是否在:

  1. 调用服务器时
  2. 当我开始迭代列表时(在我看来不太可能)
  3. 因为我需要每个实例
  4. 我认为它是1或3,但我不确定它是什么。有谁知道吗?

    (注意:我使用的是Visual Studio 2008和.net 3.5。我的客户端是Windows Mobile应用程序)

2 个答案:

答案 0 :(得分:1)

数组的分配在1处理。代理与任何其他.NET对象一样。该数组不以任何方式“透明”,也不稀疏。

基本上,当数据从服务返回时,如果它被输入为数组,则数组以及数组中的任何元素都将完全序列化/具体化。

答案 1 :(得分:0)

我的猜测是数据是在第一个myContractInstance.BigImage中分配的。这是因为MyContract是代理,但我不确定。

你可以通过评论foreach的内容并看看你是否仍然得到例外来测试这个。