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 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のイベントが発生しなくなりました。
手伝って頂けますか?
ありがとうございました!