2010-10-19 71 views
1

我有一個調用返回大量數據的SOAP WCF服務。不僅僅是呼叫的Windows Mobile設備可以處理。什麼時候分配了WCF呼叫的內存?

但我注意到一些奇怪的東西。當我打電話它看起來像這樣:

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. ,因爲我需要每個實例呼叫服務器

我認爲它是1或3,但我不確定它是哪個。有人知道嗎?

(注:我使用Visual Studio 2008和.NET 3.5我的客戶端是Windows Mobile應用程序。)

+0

如何創建客戶端,是ChannelFactory還是ClientBase?你能發佈你的界面嗎(或者它看起來如何)?有沒有Linq?我的合同是DataContract嗎? – Aliostad 2010-10-19 15:31:27

+0

@Aliostad - 服務的接口是由Visual Studio生成的一個大文件。發佈它會太大。我有Visual Studio生成的客戶端代碼,允許我調用該服務。我將在我的示例中添加一個示例。 – Vaccano 2010-10-19 15:32:51

+0

我不需要整個界面。只有你打電話給你的人會導致問題。 – Aliostad 2010-10-19 15:56:32

回答

1

該數組的分配在1處處理。該代理就像任何其他.NET對象一樣。該數組不是「透明的」,也不是稀疏的。

基本上,當數據從服務返回時,如果它被鍵入爲一個數組,那麼該數組以及數組中的任何元素都將被完全序列化/物化。

0

我的猜測是,該數據在第一myContractInstance.BigImage分配。這是因爲MyContract是一個代理,但我不確定。

你可以通過評論foreach的內容並查看你是否仍然得到異常來測試它。

+0

虛擬-1。 MyService是一個代理,而不是MyContract。 – Aliostad 2010-10-19 15:30:50

+0

(愚蠢的問題)你確定嗎?如果它們不是代理服務器,那就意味着所有的內存都是在(1)處分配的,你應該能夠在(1)之後註釋掉所有行並測試它是否仍然崩潰來測試它。 – 2010-10-19 15:33:51