C# DownloadFIleCompleted和DownloadProgressChanged未在多线程win forms应用程序中触发

C# DownloadFIleCompleted和DownloadProgressChanged未在多线程win forms应用程序中触发,c#,winforms,multithreading,webclient,C#,Winforms,Multithreading,Webclient,我在多线程应用程序中使用WebClient事件时遇到问题(DownloadFileCompleted和DownloadProgressChanged)。 我有一个创建计时器的主要方法。每隔一段时间,我将创建一个线程,如果满足条件,该线程将弹出另一个windows窗体(downloadeperform) void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e) { var thread = new Thread(S

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

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类更新程序中的另一个方法,该方法将从Downloader中计算StartDownload

public void ShowUpdateUI(Item currentItem)
{
    var downloader = new Downloader();
    downloader.StartDownload();
}
下载程序包含一个WebBrowser控件。我创建了一个调用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函数,一切都正常,并且会触发事件。当我使用worker线程从TimeRecursed启动Download时,DownloadFileAsync的事件不再触发

你能帮我吗


谢谢大家!

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

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


您还没有提供代码“这是可行的*,因此很难说出为什么会有差异。

如果您不提供显示问题的代码,很难判断可能出现了什么问题。你说你在TimeRecursed的工作线程中的StartDownload有问题,但是你没有提供从TimeRecursed中创建的线程调用StartDownload的代码。我编辑了这篇文章,提供了更多信息。谢谢你抽出时间,彼得!我启动了一个线程,因为我从WebBrowser控件获得了一个eroor,例如:“ActiveX控件‘8856f961-340a-11d0-a96b-00c04fd705a2’无法实例化,因为当前线程不在单线程单元中。”如果要在窗体上使用ActiveX控件,主线程必须是STA。创建Windows窗体应用程序时,默认情况下主线程是STA(Program.main上的STAThread)。如果你改变了这一点,那就是为什么你会犯这个错误。如果您没有更改,那么您已经创建了另一个调用WebBrowser的线程。WebBrowser只能用于STA线程,并且只能用于具有消息泵的线程。i、 你可能是对的。计时器对象可能正在使用另一个线程?是的,System.Timers.timer使用另一个线程。如果要对
勾选处理程序中的任何控件执行任何操作,应使用System.Forms.Timer