Как вы можете сделать фоновый веб-запрос, а затем обновить пользовательский интерфейс, но иметь весь код, который выполняет веб-запрос / анализ в отдельном классе, чтобы вы могли использовать его в нескольких местах? Я думал, что мог бы использовать методы классов в качестве обработчиков событий для класса BackgroundWorker, например
APIHelper mHelper = new APIHelper("http://example.com?foo=bar");
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork +=new DoWorkEventHandler(mHelper.GetResponse);
bw.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(mHelper.HandleResponse);
bw.RunWorkerAsync();
где APIHelper имеет метод
public void GetResponse(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker) sender;
WebRequest request = HttpWebRequest.Create(this.URL);
IAsyncResult result = (IAsyncResult)
request.BeginGetResponse(ResponseCallback, request);
}
но тогда я не знаю, как получить доступ к рабочему потоку из ResponseCallback, и, во всяком случае, сначала вызывается HandleResponse (очевидно). (Я попытался ввести result.AsyncWaitHandle.WaitOne();
, но получаю ошибку NotSupportedException
.) Однако я не могу понять, как сделать синхронный вызов веб-запроса. Я явно пытаюсь пойти по этому пути неправильно, но я понятия не имею, что такое правильный путь.
ETA:
Моя цель - быть в состоянии пойти:
пользователь нажимает (а) кнопку (и) (на разных страницах)
в потоке пользовательского интерфейса отображается «рабочее» сообщение (а затем ввод блокируется)
в фоновом потоке мой класс APIHelper делает соответствующий вызов API, получает ответ и передает его обратно в поток пользовательского интерфейса; Кажется, я могу сделать это, только запустив другой поток и ожидая его возврата, потому что нет синхронных веб-запросов
поток пользовательского интерфейса обновляется с возвращенным сообщением (и ввод продолжается как прежде)
Я могу сделать первые два бита, и если у меня есть ответ, я могу сделать последние биты, но я не могу понять, как сделать средний бит. Надеюсь, это прояснилось!