0

我在使用WebClient多线程应用程序(DownloadFileCompletedDownloadProgressChanged)中的事件时遇到问题。我有创建计时器的主要方法。DownloaderForm每隔一段时间,我将创建一个线程,如果满足某个条件,它将弹出另一个窗体 ( )。

void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e) {
    var thread = new Thread(SilentCheckingUpdate) {
        Name = "Update Checker",
    };
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

SilentChekingUpdate 方法检查更新。

bool found = _updater.UpdateRequired(currentConfig, out latestVersion);

if (found)
{
    _updater.ShowUpdateUI(latestVersion); 
}

如果找到,它会从 win forms 类 Updater 调用另一个方法,该方法从 Downloader 调用 StartDownload。

public void ShowUpdateUI(Item currentItem)
{
    var downloader = new Downloader();
    downloader.StartDownload();
}

下载器包含一个 WebBrowserControl。我做了一个调用 DownloadFileAsync 的方法。

public void StartDownload()
{          
    // start async download
    var client = new WebClient();

    client.DownloadProgressChanged += ClientDownloadProgressChanged;
    client.DownloadFileCompleted += ClientDownloadFileCompleted;
    var url = new Uri(_item.DownloadLink);

    client.DownloadFileAsync(url, _tempName);
}

如果我从表单线程调用 StartDownload 函数,一切正常并且会触发事件。当我使用来自 TimerElapsed 的 StartDownload 工作线程时,DownloadFileAsync 的事件不再被触发。

你能帮助我吗?

谢谢!

4

1 回答 1

2

目前尚不清楚您为什么要启动一个基本上只是调用的线程--它会DownloadFileAsync异步下载文件。如果DownloadFileAsync是异步的,则没有太多理由启动另一个线程来调用它。

我认为我会考虑的是您正在方法中创建一个本地client对象StartDownload。这几乎立即让client超出范围并可能让 GC 收集它。如果发生这种情况,可能会导致问题。 也许制作client会员字段可能会有所帮助;但是,这是一个猜测。

您没有提供“有效*”的代码,因此很难说出为什么会有差异。

于 2012-09-03T14:40:12.670 回答