Как использовать WebClient без блокировки пользовательского интерфейса? - PullRequest
5 голосов
/ 25 мая 2011

Может ли кто-нибудь указать мне учебник или предоставить пример кода для вызова метода System.Net.WebClient().DownloadString(url), не останавливая интерфейс во время ожидания результата?

Я полагаю, что это нужно будет сделать с потоком?Есть ли простая реализация, которую я могу использовать без слишком большого количества служебного кода?

Спасибо!


Реализован DownloadStringAsync, но пользовательский интерфейс все еще зависает.Есть идеи?

    public void remoteFetch()
    {
            WebClient client = new WebClient();

            // Specify that the DownloadStringCallback2 method gets called
            // when the download completes.
            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(remoteFetchCallback);
            client.DownloadStringAsync(new Uri("http://www.google.com"));
    }

    public void remoteFetchCallback(Object sender, DownloadStringCompletedEventArgs e)
    {
        // If the request was not canceled and did not throw
        // an exception, display the resource.
        if (!e.Cancelled && e.Error == null)
        {
            string result = (string)e.Result;

            MessageBox.Show(result);

        }
    }

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

Проверьте метод WebClient.DownloadStringAsync () , это позволит вам сделать запрос асинхронно, не блокируя поток пользовательского интерфейса.

var wc = new WebClient();
wc.DownloadStringCompleted += (s, e) => Console.WriteLine(e.Result);
wc.DownloadStringAsync(new Uri("http://example.com/"));

(Также не забывайте Dispose () объект WebClient, когда вы закончите)

1 голос
/ 25 мая 2011

Вы можете использовать BackgroundWorker или, как @Fulstow сказал метод DownStringAsynch.

Вот учебник по Backgorund worker: http://www.dotnetperls.com/backgroundworker

...