DownloadFIleCompleted和DownloadProgressChanged不在多线程win表单应用程序中触发

时间:2012-09-03 14:09:11

标签: c# winforms multithreading webclient

我在多线程应用程序WebClientDownloadFileCompleted中使用DownloadProgressChanged事件时遇到问题。 我有一个主要的方法,我创建了一个计时器。在一定时间间隔内,我将创建一个线程,如果满足条件,它将弹出另一个窗体(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表单类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的事件。

你能帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

你没有提供“有效*的代码”,所以很难说出为什么会有区别。