我有一个WebClient,它在同一个类中被多次触发并异步运行。我需要一种方法将请求与响应相关联。有没有办法,例如,在事件完成处理程序中获取原始URI?或者其他任何方式?
如果你愿意的话,我在银光中使用它。
谢谢, 真知晶球
答案 0 :(得分:2)
首先,在WebClient的同一个实例上实际上不能有多个异步活动。所以我暂时假设您正在创建WebClient的多个实例,而恰好正在为这些WebClient实例上的事件分配相同的函数。
因此,通过将事件的sender
参数强制转换回WebClient
,您可以简单地关联用于生成请求的WebClient实例。
此外,所有Async方法(在WebClient上或在底层WebRequest,WebResponse类型上)都有一个带有object
userToken的重载。此userToken是在由于调用而产生的任何后续事件中传递的。您可以在参数中传递任何您喜欢的对象。因此,如果您有一个对象的实例或某个ID值,您希望用它来共同关联该调用,您可以使用此参数。
WebClient wc = new WebClient();
wc.DownloadStringCompleted += Handle_DownloadStringCompleted;
wc.DownloadString(myUri, myUri);
...
void Handle_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (!e.Canceled)
{
Uri originalUri = (Uri)e.UserState;
// Do stuff with the Uri.
}
}
答案 1 :(得分:0)
这是性能的折衷,但您可以使用WebClient类的不同实例,在这种情况下,您将响应关联回触发请求的WebClient的原始实例。