Во-первых, вы не можете иметь несколько невыполненных асинхронных операций на одном и том же экземпляре WebClient. Поэтому на данный момент я предполагаю, что вы создаете несколько экземпляров WebClient и просто назначаете одну и ту же функцию событиям в этих экземплярах WebClient.
Следовательно, можно упростить корреляцию экземпляра WebClient, использованного для генерации запроса, приведя параметр sender
события обратно к WebClient
.
Кроме того, все методы Async (в WebClient или в базовых типах WebRequest, WebResponse) имеют перегрузку, которая принимает object
userToken. Этот userToken передается в любом последующем событии, которое возникает в результате вызова. Вы можете передать любой понравившийся объект в параметре. Следовательно, если у вас есть какой-то другой экземпляр объекта или какое-либо значение идентификатора, которое вы хотели бы использовать для сопутствующей связи, то вызовите этот параметр.
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.
}
}