2010-07-20 77 views
0

我有一個silverlight 4 web應用程序需要通過訪問服務器上的ASMX web服務與服務器進行通信。 我有一個列表(是的,數組),我需要發送(一個接一個)作爲參數的服務的對象。然而循環遍歷列表並運行該方法(objecttosend);將無法工作,因爲我需要發送一個又一個,Silverlight似乎只支持異步(大概不鎖定接口 - 有道理)。ASMX webservices與Silverlight異步混淆

所以,我想這一點:

public void SendNextPart() 
    { 
     if (partsToSend.Count > 0) 
     { 
      Part thisPart = partsToSend.Dequeue(); 
      fuWS.createPartCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(fuWS_createPartCompleted); 
      fuWS.createPartAsync(thisPart); 

     } 
    } 
Queue<Part> partsToSend = new Queue<Part>(); 
    void fuWS_createPartCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
     { 
      SendNextPart(); 
     } 

其中,據我能理解它,將檢查如果列表中的部分,以發送,然後運行Web服務(稱爲fuWS)方法,並刪除部分來自partsToSend List。一旦它獲得完成的事件,它應該再次運行SendNextPart方法併發送下一部分。

然而,發生的事情(通過觀看HTTPwatch得到的)是它發送第一部分,之後是一次發送2個部分,然後是越來越多,一次發送。就好像它在實際發送到服務器併成功運行該方法之前接收完成的事件。

請幫幫忙,這是竊聽了我的地獄,並且它完全打破了我需要做的:'(

+0

發送調用發送下一部分的函數的代碼。發佈SendNextBuffer的代碼。 – BigChrisDiD 2010-07-20 03:29:45

+0

嘿,對不起,我編輯了原來的部分。謝謝。 – Matt 2010-07-20 08:09:31

回答

1

我沒有看到SendNextBuffer方法,你在Web服務調用回調事件處理程序,但無論如何,最好你的代碼有競爭條件,如果web服務在partsToSend.RemoveAt行被執行之前完成並返回(理論上可行),那麼你可以在發出下一個請求之前,剛剛發送

所以首先,你應該檢查以確保你已經包含了你的例子中的所有代碼,除非你的意思是SendNextBufferSendNextPart。其次,您應該在之前移動partsToSend.RemoveAt的網絡服務調用。

最後,您應該將partsToSend列表更改爲Queue<Part>(先進先出)或Stack<Part>(後進先出),因爲這是您使用它的原因。

+0

對不起,在編輯它到這裏我設法改變SendNextPart和SendNextBuffer到不同的東西:P 他們是一樣的。我編輯了我的原始帖子,並將代碼更改爲使用隊列(FIFO或LILO都很好) - 但它仍然工作得完全一樣 – Matt 2010-07-20 08:08:51

0

好的,使用Debug.WriteLine後,我意識到我是一個白癡。 看看這個行:

fuWS.createPartCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(fuWS_createPartCompleted); 

這是什麼所做的是將每一個它必須發送一個新的兼職一個新的事件處理程序。所以第二部分現在有兩個回調,那麼第三部分會有更多的指數增長。