【发布时间】:2012-09-03 14:09:11
【问题描述】:
我在多线程应用程序(DownloadFileCompleted 和DownloadProgressChanged)中使用WebClient 事件时遇到问题。
我有创建计时器的主要方法。每隔一段时间,我将创建一个线程,如果满足某个条件,它将弹出另一个窗体 (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 的事件不再被触发。
你能帮帮我吗?
谢谢!
【问题讨论】:
-
当您不提供显示问题的代码时,很难判断可能出现的问题。您说您在 TimerElapsed 的工作线程中的 StartDownload 有问题,但您没有提供从 TimerElapsed 中创建的线程调用 StartDownload 的代码。
-
我编辑了包含更多信息的帖子。谢谢你的时间,彼得!
标签: c# winforms multithreading webclient