Как получить доступ к VIP в proxy_OpenReadCompleted методе?
void method1()
{
String VIP = "test";
WebClient proxy = new WebClient();
proxy.OpenReadCompleted += new OpenReadCompletedEventHandler(proxy_OpenReadCompleted);
String urlStr = "someurl/lookup?q=" + keyEntityName + "&fme=1&edo=1&edi=1";
}
void proxy_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
}
Есть два подхода к этому. Первый - передать строку в качестве второго параметра в вызове OpenReadAsync
, этот параметр становится значением свойства UserState
аргументов события.
void method1()
{
String VIP = "test";
WebClient proxy = new WebClient();
proxy.OpenReadCompleted += proxy_OpenReadCompleted;
String urlStr = "someurl/lookup?q=" + keyEntityName + "&fme=1&edo=1&edi=1";
proxy.OpenReadAsync(new Uri(urlStr, UriKind.Relative), VIP);
}
void proxy_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
String VIP = (string)e.UserState;
// Do stuff that uses VIP.
}
Другой подход заключается в прямом доступе к переменной с помощью закрытия:-
void method1()
{
String VIP = "test";
WebClient proxy = new WebClient();
proxy.OpenReadCompleted += (s, args) =>
{
// Do stuff that uses VIP.
}
String urlStr = "someurl/lookup?q=" + keyEntityName + "&fme=1&edo=1&edi=1";
proxy.OpenReadAsync(new Uri(urlStr, UriKind.Relative), VIP);
}
void method1()
{
String VIP = "test";
WebClient proxy = new WebClient();
proxy.OpenReadCompleted += (s,e) => proxy_OpenReadCompleted(s,e,VIP);
String urlStr = "someurl/lookup?q=" + keyEntityName + "&fme=1&edo=1&edi=1";
}
Имейте в виду, что если метод обратного вызова async записывает данные в переменную, связанную с базой данных, вы можете получить межпотоковое исключение. Вам нужно будет использовать BeginInvoke(), чтобы вернуться к потоку пользовательского интерфейса. Вот пример с использованием служб WCF, но принцип тот же.
public void examsCallback(IAsyncResult result)
{
try
{
EntityList<ExamEntity> examList = ((IExamService) result.AsyncState).EndGetAllExams(result);
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
foreach (ExamEntity exam in examList)
{
Exams.Add(exam);
}
ItemCount = Exams.Count;
TotalItemCount = Exams.ItemCount;
});
}
catch (Exception ex)
{
ErrorHandler.Handle(ex);
}
}