现在我知道我只能在Windows Phone 7中异步下载一个字符串,但在我的应用程序中我想知道哪个请求已经完成。
这是场景:
我使用WebClient()
发出了某个下载请求
我使用以下代码完成下载
WebClient stringGrab = new WebClient();
stringGrab.DownloadStringCompleted += ClientDownloadStringCompleted;
stringGrab.DownloadStringAsync(new Uri(<some http string>, UriKind.Absolute));
如果此请求需要很长时间才能满足用户的喜好,我会给用户提供另一个下载请求的选项。 我的问题是当/如果两个请求返回时,我没有方法/方式知道哪个是哪个,即哪个是前请求,哪个是第二个! 有没有一种知道/同步请求的方法?
我无法更改返回不同DownloadStringCompleted方法的请求!
提前致谢!
答案 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 /数据在几分钟的阈值内更新(或者你指定的时间长。)