用于下载文件 C# 的线程

本文关键字:线程 文件 下载 用于 | 更新日期: 2023-09-27 18:36:55

我的线程有问题,我有以下代码(示例):

private void button_Click(object sender, EventArgs e) {
    ShowMessage("Starting Downloads...");
    <more code>
    StartDownloads();
    RunFileDownload();
    <more code>
}
private void StartDownloads() {
    <more code>
    for (int i=0; i<10; i++) {
        ShowMessage("Downloading file: " + i);
        Download(i);
        <more code>
    }
    <more code>
}

问题是,当我按下按钮并开始下载时,消息不显示......我试图用线程修复它,如下所示:

private void button_Click(object sender, EventArgs e) {
    ShowMessage("Starting Downloads...");
    Thread t = new Thread(new ThreadStart(StartDownloads));
    t.Start();
    RunFileDownload();
}

但是 RunFileDownload(); 函数在文件下载之前启动。我尝试使用"Thread.Join();"解决此问题,但再次不显示消息(主线程已暂停)。

我想用多线程和 Thread.Join() 来解决它;但它效率不高,我会在主线程中遇到其他函数的问题。

我该如何解决这个问题?谢谢。

编辑#2:

考虑此代码:

private void Download() {
    ShowMessage("Starting Downloads...");
    Thread t = new Thread(new ThreadStart(StartDownloads));
    ShowMessage("Downloads Finished...");   | not run until
    RunFileDownload();                      | finished
    ShowMessage("Files Executed...");       | thread.
}

在执行其余代码之前,我如何期望线程完成?我尝试使用 Thread.Join();但它冻结了应用程序。

用于下载文件 C# 的线程

假设您可以访问 async/await ,最简单的解决方案是这样的:

private async void button_Click(object sender, EventArgs e)
{
    ShowMessage("Starting Downloads...");
    await StartDownloads(); //Return control until this method completes!
    RunFileDownload();
}

请注意,await的例外,可以说,不那么善良。请确保您使用正确的尝试/捕获块,尤其是从await开始。请考虑使用此模式:使用异步与"旧的异步委托"触发后忘记并阅读本文。

请注意,StartDownloads需要异步并返回一个Task才能正常工作。

除了该解决方案之外,您还需要线程在完成时调用回调或引发事件,以便您可以运行RunFileDownload 。使用BackgroundWorker可以简化该过程。