如何在Wp7中同步HttpRequest或WebClient?

时间:2011-03-06 03:16:45

标签: windows-phone-7 webclient httprequest

现在我知道我只能在Windows Phone 7中异步下载一个字符串,但在我的应用程序中我想知道哪个请求已经完成。 这是场景: 我使用WebClient()发出了某个下载请求 我使用以下代码完成下载

WebClient stringGrab = new WebClient(); stringGrab.DownloadStringCompleted += ClientDownloadStringCompleted; stringGrab.DownloadStringAsync(new Uri(<some http string>, UriKind.Absolute));

如果此请求需要很长时间才能满足用户的喜好,我会给用户提供另一个下载请求的选项。 我的问题是当/如果两个请求返回时,我没有方法/方式知道哪个是哪个,即哪个是前请求,哪个是第二个! 有没有一种知道/同步请求的方法?

我无法更改返回不同DownloadStringCompleted方法的请求!

提前致谢!

3 个答案:

答案 0 :(得分:3)

为什么不这样做:

void DownloadAsync(string url, int sequence)
{
    var stringGrab = new WebClient();
    stringGrab.DownloadStringCompleted += (s, e) => HandleDownloadCompleted(e, sequence);
    stringGrab.DownloadStringAsync(new Uri(url, UriKind.Absolute));
}

void HandleDownloadCompleted(DownloadStringCompletedEventArgs e, int sequence)
{
    // The sequence param tells you which request was completed
}

答案 1 :(得分:1)

这是一个有趣的问题,因为默认情况下WebClient不带任何唯一标识符。但是,您可以获取哈希代码,这对于每个给定的实例都是唯一的。

所以,例如:

WebClient client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client.DownloadStringAsync(new Uri("http://www.microsoft.com", UriKind.Absolute));

WebClient client2 = new WebClient();
client2.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client2.DownloadStringAsync(new Uri("http://www.microsoft.com", UriKind.Absolute));

每个实例都有自己的哈希代码 - 您可以在实际调用DownloadStringAsync方法之前存储它。然后你会添加这个:

int FirstHash = client.GetHashCode();
int SecondHash = client2.GetHashCode();

在完成事件处理程序中,您可以拥有:

if (sender.GetHashCode() = FirstHash)
{
    // First completed
}
else
{
    // Second completed
}

记住:每次重新实例化都会给出一个新的哈希码。

答案 2 :(得分:0)

如果请求基本相同,而不是跟踪正在返回的请求。为什么不跟踪以前是否已经退回?或者,自上一次返回后多久。

如果您只想获取此数据一次,但尝试允许用户重新发出请求(如果需要很长时间),则可以忽略除第一个成功返回的结果之外的所有数据。这样,用户发出额外请求的次数并不重要,您无需跟踪每个请求的唯一内容。

同样,如果用户可以在任何时候从远程服务请求/更新数据,您可以跟踪自上次成功获取数据的时间,并且如果您在不久之后获得另一个resoponse,则无需更新模型/ UI那。最好不要在这种情况下提出请求,但是如果你必须处理响应中的长延迟和竞争条件,你可以使用这种技术并仍然保持UI /数据在几分钟的阈值内更新(或者你指定的时间长。)