我有一个silverlight 4网络应用程序,需要通过访问服务器上的ASMX Web服务与服务器通信。 我有一个列表(是的,数组),我需要发送的对象(逐个)作为服务的参数。但是循环遍历列表并运行方法(objecttosend);将无法工作,因为我需要一个接一个地发送,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();
}
据我所知,将检查List是否有要发送的部分,然后运行webservice(称为fuWS)方法并从partsToSend List中删除该部分。一旦获得完成的事件,它应该再次运行SendNextPart方法并发送下一部分。
然而,正在发生的事情(通过观看HTTPwatch选择了这一点)是它发送第一部分,然后一次发送2个部分然后在那之后越来越多,同时发送。几乎就像它在实际发送到服务器并成功运行方法之前接收完成的事件一样。
请帮助,这对我来说很麻烦,它彻底打破了我需要做的事情:'(
答案 0 :(得分:1)
我没有看到您在Web服务回调事件处理程序中调用的SendNextBuffer
方法。但无论如何,最好的代码都有竞争条件。如果Web服务完成并在执行partsToSend.RemoveAt
行之前返回(理论上可行),那么您可以在删除刚刚发送的请求之前发出下一个请求。
首先,您应检查以确保已包含示例中的所有代码,除非您打算SendNextBuffer
说SendNextPart
。
其次,您应该在网络服务电话之前移动partsToSend.RemoveAt
行。
最后,您应该将partsToSend列表更改为Queue<Part>
(先进先出)或Stack<Part>
(后进先出),因为这就是您使用它的原因
答案 1 :(得分:0)
好的,所以在使用Debug.WriteLine之后,我意识到我是个白痴。 看看这一行:
fuWS.createPartCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(fuWS_createPartCompleted);
这是在每次必须发送新部件时添加新的事件处理程序。因此,第二部分发送现在有两个回调,然后第三部分将有更多,所以指数增加。