在Windows Phone 7中调用异步方法

时间:2012-05-02 19:27:03

标签: windows-phone-7

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

2 个答案:

答案 0 :(得分:2)

  

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

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

答案 1 :(得分: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的范围内捕获。