0

我试图在一个单独的非 ui 线程上下载一个字符串,当它完成下载更新 ui 时,但我想在没有 ui 冻结的情况下这样做,所以我尝试创建一个线程但没有用,然后我尝试在该线程中创建一个线程,但这也不起作用如何在不冻结 ui 的情况下调用 downloadstring 函数?

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 web = new Thread(() => webDownload(url));
        web.Start();

    }
    // Go (sorting) button
    private void button2_Click(object sender, EventArgs e)
    {

    }
    public void webDownload(string address)
    {
        Thread next = new Thread(() => downloading(address));
        next.Start();
        //  next.Join();

    }
    public void downloading(string address){

        using (WebClient client = new WebClient())
        {
           string content = client.DownloadString(address);
           textBox2.BeginInvoke(new displayDownloadDelegate(displayDownload), content);

        }

   }
    private void displayDownload(string content)
    {
        textBox2.Text = content;
    }
4

1 回答 1

1

尽管您可以简单地使用async-await异步WebClient.DownloadStringTaskAsync方法,但如果您真的必须使用同步WebClient.DownloadString方法(出于某种原因)通过在单独的非 UI 线程上执行它,您仍然可以使用Task.Run()and非常简单地做到这一点async-await

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

    using (WebClient client = new WebClient())
    {
        textBox2.Text = await Task.Run(() => client.DownloadString(url));
    }
}
于 2015-07-26T02:17:31.877 回答