Silverlight: Как передать данные от запроса до ответа с помощью Асинхронного режима Webclient?

Как получить доступ к 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)
{ 

}
5
задан Cœur 18 January 2018 в 04:29
поделиться

3 ответа

Есть два подхода к этому. Первый - передать строку в качестве второго параметра в вызове 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);
}    
3
ответ дан 15 December 2019 в 00:54
поделиться
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";
}
1
ответ дан 15 December 2019 в 00:54
поделиться

Имейте в виду, что если метод обратного вызова 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);
    }
}
0
ответ дан 15 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: