Silverlight: Как передать данные из запроса в ответ с помощью асинхронного режима Webclient? - PullRequest
5 голосов
/ 03 мая 2010

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

}

Ответы [ 3 ]

3 голосов
/ 03 мая 2010

Есть два подхода к этому. Сначала необходимо передать строку как второй параметр в вызове 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);
}    
1 голос
/ 03 мая 2010
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";
}
0 голосов
/ 03 мая 2010

Имейте в виду, что если метод асинхронного обратного вызова записывает данные в переменную с привязкой к данным, вы, вероятно, получите исключение между потоками.Вам нужно будет использовать 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...