[英]ASMX webservices with Silverlight Async confusion
我有一個Silverlight 4 Web應用程序,該應用程序需要通過訪問服務器上的ASMX Web服務來與服務器進行通信。 我有一個列表(是的,數組),我需要將對象(一個一個地發送)作為服務的參數。 但是循環遍歷列表並運行方法(objecttosend); 將無法正常工作,因為我需要一個接一個地發送,而Silverlight似乎僅支持Async(大概不支持鎖定接口-很有道理)。
所以我嘗試了這個:
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();
}
據我所知,它將檢查列表是否有要發送的部分,然后運行webservice(稱為fuWS)方法並從partsToSend列表中刪除該部分。 一旦獲得完成事件,則應再次運行SendNextPart方法並發送下一部分。
但是發生了什么(通過觀看HTTPwatch對此進行了記錄)是它發送了第一部分,然后又一次發送了2個部分,然后又發送了越來越多的所有部分。 幾乎就好像它在實際發送到服務器並成功運行該方法之前正在接收已完成的事件。
請幫助,這使我煩惱不已,這完全破壞了我需要做的事情:'(
我沒有在Web服務回調事件處理程序中看到正在調用的SendNextBuffer
方法。 但無論如何,充其量您的代碼具有競爭條件。 如果Web服務完成並在執行partsToSend.RemoveAt
行之前返回(從理論上講是可能的),那么您可能要發出下一個請求,然后再刪除剛發送的請求。
因此,首先,您應該檢查並確保示例中包含了所有代碼,除非您SendNextBuffer
說出SendNextPart
。
其次,您應該在調用Web服務之前將partsToSend.RemoveAt
行。
最后,您可能應該將partsToSend列表更改為Queue<Part>
(先進先出)或Stack<Part>
(后進先出),因為這就是您使用它的方式。
好的,所以在使用Debug.WriteLine之后,我意識到自己是個白痴。 查看以下行:
fuWS.createPartCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(fuWS_createPartCompleted);
這樣做是在每次必須發送新零件時添加一個新的事件處理程序。 因此,第二部分發送現在有兩個回調,而第三部分將有更多,以此類推。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.