Как использовать WebClients DownloadStringAsync, чтобы избежать зависания пользовательского интерфейса?

Я пытаюсь выяснить, как заставить пользовательский интерфейс перестать зависать всякий раз, когда я нажимаю кнопку, я хочу, чтобы нажатие кнопки загружало строку, я пробовал асинхронные функции и синхронные функции и добавлял один поток, а затем добавлял два потока, но я не могу понять, как заставить его работать. Это моя последняя попытка, может кто-нибудь объяснить мне, чего мне не хватает? Я использую поток здесь, потому что я читал, что вызов асинхронной функции не обязательно запускает новый поток.

public partial class Form1 : Form
{
    private delegate void displayDownloadDelegate(string content);
    public Thread downloader, web;
    public Form1()
    {
        InitializeComponent();
    }
    // Go (Download string from URL) button
    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Enabled = false;

        string url = textBox1.Text;
        Thread t = new Thread(() =>
        {
            using (var client = new WebClient())
            {
                client.DownloadStringCompleted += (senderi, ei) =>
                {
                    string page = ei.Result;
                    textBox2.Invoke(new displayDownloadDelegate(displayDownload), page);
                };

                client.DownloadStringAsync(new Uri(url));
            }
        });
        t.Start();
    }
    private void displayDownload(string content)
    {
        textBox2.Text = content;
    }

person user3743168    schedule 25.07.2015    source источник
comment
зависает ли он во время загрузки или когда текст добавляется в textbox2, так как это тот, который работает в потоке графического интерфейса. Насколько я вижу, потоки, которые вы используете, делают это правильно.   -  person Icepickle    schedule 26.07.2015
comment
сразу после того, как я нажму кнопку, пользовательский интерфейс зависает примерно на 4 секунды, пока загрузка не будет завершена, а затем он правильно обновляет пользовательский интерфейс   -  person user3743168    schedule 26.07.2015


Ответы (1)


Рассмотрите возможность использования более простого WebClient.DownloadStringTaskAsync метод, позволяющий использовать ключевые слова async-await.

Код будет просто выглядеть так:

private async void button1_Click(object sender, EventArgs e)
{
    textBox1.Enabled = false;

    string url = textBox1.Text;
    using (var client = new WebClient())
    {
        textBox2.Text = await client.DownloadStringTaskAsync(new Uri(url));
    }
}
person sstan    schedule 26.07.2015