Как обновить пользовательский интерфейс из запроса HttpWebRequest? - PullRequest
0 голосов
/ 24 января 2012

В моем файле Mainpage.xaml.cs есть функция, которая создает экземпляр другого класса и пытается загрузить веб-страницу, используя запрос HttpWebRequest из этого экземпляра.Проблема в том, что когда мне удалось загрузить веб-страницу, я не могу отправить ее обратно в основной поток пользовательского интерфейса.Я пытался использовать Deployment.Current.Dispatcher.BeginInvoke для отправки веб-страницы обратно в ожидающий TextBlock, но при попытке получить сообщение об отсутствии доступа к TextBlock из другого класса.Есть ли способ передачи данных между двумя потоками без использования LocalStorage ?

РЕДАКТИРОВАТЬ : код ниже:

MainPage:

private void button1_Click(object sender, RoutedEventArgs e)
    {
        Member m = new Member(name, id);
    }

Класс участника:

public Member(String Member, String API)
    {
        APIKey = API;
        MemberName = Member;
        this.super = super;
        DoSend(method, string, "", null);
    }

public void DoSend(string method, string url, string body, string mimetype)
    {
        if (WebRequest.RegisterPrefix("https://",System.Net.Browser.WebRequestCreator.ClientHttp)) {
            HttpWebRequest request = WebRequest.Create(makeURI(url)) as HttpWebRequest;

        request.Method = method;
        request.Headers["X-NFSN-Authentication"] = MakeAuthHeader(url,body);
        if (body != "")
        {
            byte[] bodyData = Encoding.UTF8.GetBytes(body);
            request.ContentType = mimetype;
            //Stuff Should Happen Here
        }

        else
            doStuff(request);
        }

public void doStuff(HttpWebRequest httpReq)
    {
        httpReq.BeginGetResponse(r =>
        {
            var httpRequest = (HttpWebRequest)r.AsyncState;
            var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);

            using (var reader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var response = reader.ReadToEnd();
                ResponseBlock.Text = response; //Invalid cross-thread reference
            }
        }, httpReq);
    }

1 Ответ

1 голос
/ 24 января 2012

MainPage:

customClass.DownloadPage((result) =>
{
    textBlock.Text = result;
},
(exception) =>
{
    MessageBox.Show(exception.Message);
});

CustomClass:

public void DownloadPage(Action<string> callback, Action<Exception> exception)
{
    WebClient webClient = new WebClient();
    webClient.DonwloadStringCompleted += (s, e) =>
    {
        if (e.Error == null)
        {
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                callback(e.Result);
            });
        }
        else
        {
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                exception(e.Error);
            });
        }
    };
    webClient.DonwloadStringAsync();
}
...