在下载Webclient文件的同时运行后台worker

本文关键字:运行 后台 worker 下载 Webclient 文件 | 更新日期: 2023-09-27 18:18:59

我有一个后台工作器,用于运行与服务器的耗时同步操作,并且工作完美,UI在操作期间响应

        BackgroundWorker syncWorker = new BackgroundWorker();
        syncWorker.WorkerReportsProgress = true;            
        syncWorker.DoWork += new DoWorkEventHandler(syncWorker_DoWork);
        syncWorker.ProgressChanged += new ProgressChangedEventHandler(syncWorker_ProgressChanged);
        syncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(syncWorker_RunWorkerCompleted);
    private void syncWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        foreach (xxxx item in actives)
        {
            target.ReportProgress(progress);
           //time taking event running fine here..
        }
        target.ReportProgress(90);          
    }
    private void syncWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
       lbl_progress.Text="Wait......";
    }
    private void syncWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
       lbl_progress.Text="DONE!..";
    }           

现在我必须做一个文件下载操作,我使用Webclient来做它使用代码

            WebClient  downloadClient = new WebClient();
            downloadClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(downloadClient_DownloadProgressChanged);
            downloadClient.DownloadFileCompleted += new AsyncCompletedEventHandler(downloadClient_DownloadFileCompleted);   
            downloadClient.DownloadFileAsync(new Uri(fileUrl), download_path);      
           void downloadClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
            {
                double bytesIn = double.Parse(e.BytesReceived.ToString());
                double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
                double percentage = bytesIn / totalBytes * 100;
                int progress_value = int.Parse(Math.Truncate(percentage).ToString());
                progress_value = (progress_value < 5) ? 5 : (progress_value > 95) ? 95 : progress_value;          
                lblDownloadProgress.Content = string.Format("DOWNLOADING - {0}%", progress_value.ToString());
            }
            void downloadClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
            {
                string item = (string)e.UserState;
                if (e.Error != null )
                {
                    lblDownloadProgress.Content = "Unable to download.Try again.....";
                    lblDownloadProgress.Foreground = Brushes.Red;
                }
                else if (e.Cancelled)
                {
                    //Do Nothing
                }
                else
                {
                    lblDownloadProgress.Content ="DOWNLOADED..";
                }
            }

现在我可以并行运行这两个东西吗?就像在下载文件时运行后台工作程序一样??如果文件下载先完成,等待后台worker完成如果后台worker先完成,则等待下载完成
在两个操作完成后启用控件,并在整个过程中保持UI响应

在下载Webclient文件的同时运行后台worker

你可以并行运行2个后台worker,但如果你需要检查其中一个的状态,你可以检查后台worker是否忙(正在工作或已完成)

private void syncWorker_DoWork(object sender, DoWorkEventArgs e)
    {
     while( downloadClient.IsBusy)
            {
             Sleep(5000);
             //waiting downloadClient  worker to complete
            }
             //continue the work
}

看看你能做些什么。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Threading;
namespace download_demo
{
    class Program
    {

        static void Main(string[] args)
        {   
            BackgroundWorker MyWorker = new BackgroundWorker();
           MyWorker.DoWork += MyWorker_DoWork;
           MyWorker.RunWorkerCompleted +=MyWorker_RunWorkerCompleted;
           MyWorker.RunWorkerAsync();
           Console.ReadKey();
        }
        private static void MyWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Console.WriteLine("both job completed");
        }
        private static void MyWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Thread download = new Thread(DownloadJob);
            download.Start();
            for (int i = 0; i < 5; i++)
            {
                Thread.Sleep(20);
                Console.WriteLine("doing some job while downloading ");
            }
            Console.WriteLine("waiting the end of download......... ");
            download.Join();
        }
        private static void DownloadJob(object path)
        {
           /// process download the path
           ///simulate 20 seconde of download
           for(int i = 0;i<100;i++)
           {
               Thread.Sleep(50);
               Console.WriteLine("downloaded :" + i + " Ko");
           }
        }
    }
}