【问题标题】:ASMX webservices with Silverlight Async confusion具有 Silverlight 异步混淆的 ASMX Web 服务
【发布时间】:2010-07-20 02:59:35
【问题描述】:

我有一个 silverlight 4 Web 应用程序,它需要通过访问服务器上的 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();
        }

据我所知,它将检查列表是否有要发送的部分,然后运行 ​​webservice(称为 fuWS)方法并从partsToSend 列表中删除该部分。一旦它获得完成的事件,它应该再次运行 SendNextPart 方法并发送下一部分。

但是发生的事情(通过观看 HTTPwatch 发现)是它发送第一部分,然后一次发送 2 个部分,然后越来越多,一次发送。几乎就像它在实际发送到服务器并成功运行方法之前接收到完成的事件一样。

请帮忙,这让我很烦,它完全破坏了我需要做的事情:'(

【问题讨论】:

  • 贴出调用 send next 部分的函数的代码。发布 SendNextBuffer 的代码。
  • 嘿抱歉,我编辑了原始部分。谢谢。

标签: c# .net web-services silverlight-4.0 asmx


【解决方案1】:

我没有看到您在 Web 服务回调事件处理程序中调用的 SendNextBuffer 方法。但无论如何,你的代码充其量是有竞争条件的。如果 Web 服务在执行 partsToSend.RemoveAt 行之前完成并返回(理论上可能),那么您可能会在删除刚刚发送的请求之前发出下一个请求。

所以首先,您应该检查以确保您已在示例中包含所有代码,除非您打算让 SendNextBufferSendNextPart

其次,您应该将partsToSend.RemoveAt移到 Web 服务调用之前。

最后,您可能应该将partsToSend 列表更改为Queue&lt;Part&gt;(先进先出)或Stack&lt;Part&gt;(后进先出),因为这就是您使用它的方式。

【讨论】:

  • 抱歉,在将其编辑到此处时,我设法将 SendNextPart 和 SendNextBuffer 更改为不同的东西:P 它们是相同的。我已经编辑了我的原始帖子,并将代码更改为使用队列(FIFO 或 LILO 都可以) - 但它仍然可以完全一样
【解决方案2】:

好的,所以在使用 Debug.WriteLine 之后,我意识到自己是个白痴。 看看这一行:

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

这样做是在每次必须发送新部件时添加一个新的事件处理程序。所以第二部分发送现在有两个回调,然后第三部分会有更多,依此类推。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多