Во-первых, Dispatcher.BeginInvoke
требуется, только когда вы находитесь в потоке, отличном от потока пользовательского интерфейса (где происходит все, что связано с silverlight / WPF). При событии щелчка вы уже находитесь в потоке пользовательского интерфейса, поэтому нет необходимости вызывать его.
Во-вторых, BeginGetResponse
является асинхронной операцией, поэтому после ее завершения она вызовет функцию обратного вызова в другом потоке, здесь ReqCallback
. Именно в этом методе вы можете вызвать EndGetResponse
. Этот шаблон применяется ко всем BeginX / EndX, которые вы найдете в фреймворке.
Однако, поскольку вы находитесь в другом потоке, вам нужно будет использовать BeginInvoke
для отправки метода обратно в поток пользовательского интерфейса.
Код будет выглядеть так:
private void button7_Click(object sender, RoutedEventArgs e) {
string url = @"http://eu.wowarmory.com/guild-info.xml?r=Eonar&n=Gifted and Talented";
HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create(url);
httpWebRequest.BeginGetResponse(ReqCallback, httpWebRequest);
}
private void ReqCallback(IAsyncResult asyncResult)
{
HttpWebRequest httpWebRequest = (HttpWebRequest) asyncResult.AsyncState;
using (HttpWebResponse httpWebResponse = (HttpWebResponse) httpWebRequest.EndGetResponse(asyncResult))
{
XDocument x = XDocument.Load(httpWebResponse.GetResponseStream());
Dispatcher.BeginInvoke((Action) (() => ShowGuildies(x)));
}
}
Обратите внимание, что вы также можете обрабатывать XML в потоке и использовать диспетчер только для отправки обратно гильдий в UI, чтобы избежать зависания UI, если XML очень длинный для анализа (не должно быть так). 1015 *
Редактировать: Исправлен код. Вам нужно только реализовать ShowGuildies
. Что касается подключения к Интернету и задержек, поскольку операция происходит в другом потоке, пользовательский интерфейс не зависает. Вы можете показать анимацию загрузки или что-то еще.