0

有没有办法在 Windows Phone 7 应用程序中异步使用服务器方法?我有一个数据列表。在 foreach 循环中,为每个数据向服务器发送一个请求,但它们没有按照我的调用顺序完成。我怎样才能做到这一点?

4

2 回答 2

2

我有一个数据列表。在 foreach 循环中,为每个数据向服务器发送一个请求,但它们没有按照我的调用顺序完成。我怎样才能做到这一点?

那么你可以有效地使它们同步 - 摆脱它作为一个实际的foreach 循环,而是设置适当的异步回调,以便当第一个响应进来时,你发送第二个请求,等等,直到没有更多的请求。(您可能希望使用 aQueue<T>将要发送的请求排队。)

于 2012-05-02T19:28:47.340 回答
0

不要仅仅因为某些东西似乎不起作用而恢复到同步方式。在异步世界中工作有很多好处。也有一些危险。关键是知道如何避免这些危险。这是一个使用 WebClient 的示例,它会产生有害影响。

foreach (var item in items)
{
    WebClient client = new WebClient();
    client.DownloadStringCompleted += (sender, args) =>
        {
            item.Stuff = args.Result;
        };
    client.OpenReadAsync(new Uri("http://mydomain.com/stuff"));
}

返回客户端时,不能保证item与“创建”客户端请求的项目相同。这被称为“访问修改后的关闭器”。这仅仅意味着您可能正在尝试修改不再存在或不一样的东西。正确的方法是在 foreach 中捕获您的项目,如下所示:

foreach (var item in items)
{
    var internalItem = item;
    WebClient client = new WebClient();
    client.DownloadStringCompleted += (sender, args) =>
        {
            internalItem.Stuff = args.Result;
        };
    client.OpenReadAsync(new Uri("http://mydomain.com/stuff"));
}

这可确保您使用正确的项目,因为它已在 foreach 范围内捕获。

于 2012-05-03T03:57:39.167 回答