我在多线程应用程序WebClient
和DownloadFileCompleted
中使用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的事件。
你能帮助我吗?
谢谢!
答案 0 :(得分:1)
目前还不清楚为什么你要启动一个基本上只调用DownloadFileAsync
的线程 - 它会下载文件异步。如果DownloadFileAsync
是异步的,则没有太多理由启动另一个线程来调用它。
我想看一下,您在client
方法中创建了一个本地StartDownload
对象。这几乎立即让client
超出范围,并可能让GC收集它。如果发生这种情况,可能会导致问题。 也许使client
成员字段可能会有所帮助;但是,这是猜测。
你没有提供“有效*的代码”,所以很难说出为什么会有区别。