0

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のイベントが発生しなくなりました。

手伝って頂けますか?

ありがとうございました!

4

1 に答える 1