0

所以基本上我想在互联网上检索 .txt 文件的内容并将其写入 aa 标签。但是,尽管这样做,Windows 窗体会冻结。

所以我想把它放到一个BackgroundWorker中。还有一个进度条,应该在进度期间填充。我的代码如下所示:

private void RetrieveTxt(string currentversion)
    {
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    }

void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        WebClient wc = new WebClient();
        label1.Text = wc.DownloadString("http://example.org/version.txt");
    }

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        updateProgress.Value = e.ProgressPercentage;
    }

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        updateProgress.Visible = false;
    }

但是,它不起作用。标签永远不会更新,进度条保持空白。

任何帮助表示赞赏,谢谢!:)

4

2 回答 2

4

如果您使用的是 C# 5.0,则可以执行以下操作:

label1.Text = await client.DownloadStringTaskAsync("http://example.org/version.txt");

就是这么简单。

如果不是,那么您可以利用 ; 的异步支持WebClient。您不需要使用 BackgroundWorker:

WebClient client = new WebClient();
client.DownloadStringCompleted += (s, data) =>
{
    label1.Invoke(new Action(() => label1.Text = data.Result));
};
client.DownloadStringAsync(new Uri("http://example.org/version.txt"));

至于为什么你的代码不起作用:

  1. 你从来没有真正启动过工人。你从来没有打电话worker.RunWorkerAsync();
  2. 您正在从后台任务访问 UI 控件,因此当您尝试从DoWork处理程序访问标签时它会中断。您需要将结果设置为WebClient返回的字符串,然后在完成的处理程序中设置标签。
于 2013-05-23T19:22:53.107 回答
1

您需要一个委托,因为后台线程无法对 UI 控件进行操作:

private delegate void InvokeUpdateText(String theText);
private void UpdateText(String theText)
{
    if (InvokeRequired)
    {
        try { Invoke(new InvokeUpdateText(UpdateText), theText); }
        catch { }
        return;
    }
    label1.Text = theText;
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    WebClient wc = new WebClient();
    UpdateText("http://example.org/version.txt");
}
于 2013-05-23T19:27:23.660 回答