0

ここで多くの質問があったことは知っていますが、私はたくさんの質問を経験しましたが、ほとんど運がありませんでした. 私はイベントとバックグラウンド ワーカーが初めてで、これを実装する最善の方法がわかりません。

私は C# で基本的な Windows フォームを持っています。プログレスバーが含まれています。ファイルをダウンロードするクラスを呼び出しています。そのダウンロードに基づいて進行状況バーを更新したい。すべてが同じクラスにある場合は正常に動作しますが、この状況では動作しません。これを処理する最善の方法は何ですか?どうすればよいですか? 現在、私はこれをやっています:

WebClient downloader = new WebClient();             
downloader.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);

そして、進行状況が変更された場合、私はこれを行います:

public void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    pbDownload.Value = e.ProgressPercentage;
}

しかし、プログレスバーを除くすべてを別のクラスに入れると、すべてがめちゃくちゃになります。アイデア?ありがとう!

4

2 に答える 2

0

この魔女はあなたがやろうとしていることとほぼ同じで、正常に動作します FStatus ... フォーム参照

 FrmStatus FStatus = null;

        public void ProgressInit(String caption, string opis, int Max)
        {
            FStatus = new SZOKZZ.FrmStatus();
            FStatus.InitProc(Max);
            FStatus.SetCaption(caption, opis);
            FStatus.Show();
        }

        public void DLProgress(string curl, string cdl)
        {
            WebClient webClient = new WebClient();
            webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DLDone);
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DLSetProc);
            webClient.DownloadFileAsync(new Uri(curl), cdl);
        }
        private void DLSetProc(object sender, DownloadProgressChangedEventArgs e)
        {
            this._FileProcentDownloaded = e.ProgressPercentage;
            FStatus.SetProcDL(this._FileProcentDownloaded);

        }
        private void DLDone(object sender, AsyncCompletedEventArgs e)
        {
            _DlError = e.Error;
            FStatus.Dispose();
            FStatus = null;
        }
于 2013-02-07T08:03:40.633 に答える
0

Application.DoEvents(); を呼び出す必要があります。新しい値に基づいてフォームにコントロールを強制的に更新するには:

   public void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            pbDownload.Value = e.ProgressPercentage;
            Application.DoEvents();
        }

よろしく

于 2013-02-07T10:45:49.833 に答える