2009-11-17 4 views
1

J'ai un client Web qui est renvoyé plusieurs fois dans la même classe et s'exécute de manière asynchrone. J'ai besoin d'un moyen de corréler la demande à la réponse. Existe-t-il un moyen, par exemple, d'obtenir l'URI d'origine dans l'événement handler terminé? Ou de toute autre manière? J'utilise ceci dans silverlight, si ça devait vous intéresser.Corréler l'événement terminé au WebClient d'origine?

Merci, Palantir

Répondre

2

Tout d'abord, vous ne pouvez pas avoir fait de multiples activités Asynchronous en circulation à la même instance d'un WebClient. Donc, je suppose pour le moment que vous créez plusieurs instances de WebClient et que vous attribuez la même fonction aux événements de ces instances WebClient.

De manière simpliste, vous pouvez corréler l'instance WebClient utilisée pour générer la requête en renvoyant le paramètre sender de l'événement à WebClient.

De plus toutes les méthodes asynchrones (sur WebClient ou sur les WebRequest sous-jacents, types WebResponse) ont une surcharge qui prend un object userToken. Ce userToken est le passé dans tout événement ultérieur qui survient à la suite de l'appel. Vous pouvez passer n'importe quel objet que vous aimez dans le paramètre. Par conséquent, si vous avez une autre instance d'un objet ou une valeur d'ID que vous souhaitez utiliser pour co-relier cet appel, vous pouvez utiliser ce paramètre.

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. 
    } 
} 
0

Il est un métier hors de la performance, mais vous pouvez utiliser différentes instances de la classe WebClient dans ce cas, vous auriez corrélat la réponse à l'instance d'origine de la WebClient qui a déclenché la requête.