如何获取某个线程的当前进度,并通过进度条展现?

解决方案 »

  1.   

    backgroundWorker的ProgressChanged事件
      

  2.   

    to sdyqingdao :
     你的意思是不是只能自己定一个假的,模拟一下。
      

  3.   

    to zhengshaodong
    就是没有办法获取到当前的进度。我的程序是实现写文件的功能,一次性写多个文件,文件数是可变的。这样怎么获取类似与(已下载的文件大小/文件的总大小)的大小呢?
      

  4.   

    参考代码片段        /// <summary>
            /// 开始下载
            /// </summary>
            public void Start()
            {
                int splitRangeSize = 512;
                long downloadedRange = 0;
                FileStream fileStream;
                //未下载完毕前使用临时文件名 名字后缀加.!tmp
                string tempSavePath = this.savePath + ".!tmp";
                //检查文件是否下载好了 如果已经下载完毕 则退出当前这个文件的下载
                if (File.Exists(this.savePath))
                {
                    if (this.UpdateCompleted != null)
                    {
                        this.UpdateCompleted(this, new UpdateCompletedEventArgs(this.savePath, this.requestUrl));
                    }
                    return;
                }            //检查文件是否存在 存在则获取当前文件流的大小 
                if (File.Exists(tempSavePath))
                {
                    fileStream = File.OpenWrite(tempSavePath);
                    downloadedRange = fileStream.Length;
                    fileStream.Seek(downloadedRange, SeekOrigin.Current);
                }
                else
                {
                    fileStream = new FileStream(tempSavePath, FileMode.Create);
                }            //开始下载
                try
                {
                    HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(this.requestUrl);
                    //如果当前文件已经下载了一部分,则向HttpWebRequest添加Range值
                    if (downloadedRange > 0)
                    {
                        httpRequest.AddRange((int)downloadedRange);
                    }
                    Stream tempStream = httpRequest.GetResponse().GetResponseStream();
                    byte[] tempBuffer = new byte[splitRangeSize];
                    int tempFsReadSize = 0;
                    tempFsReadSize = tempStream.Read(tempBuffer, 0, splitRangeSize);
                    while (tempFsReadSize > 0)
                    {
                        fileStream.Write(tempBuffer, 0, tempFsReadSize);
                        //下载一段后触发UpdateProgress事件 更新界面的进度信息
                        if (this.UpdateProgress != null)
                        {
                            this.UpdateProgress(this, new UpdateProgressEventArgs((int)fileStream.Length));
                        }
                        System.Threading.Thread.Sleep(20);
                        tempFsReadSize = tempStream.Read(tempBuffer, 0, splitRangeSize);
                    }
                    tempStream.Close();
                    Console.WriteLine("下载完成");
                    fileStream.Close();
                    //下载完成后把临时文件名更改过来
                    File.Move(tempSavePath, this.savePath);                if (this.UpdateCompleted != null)
                    {
                        this.UpdateCompleted(this, new UpdateCompletedEventArgs(this.savePath, this.requestUrl));
                    }
                }
                catch (Exception err)
                {
                    if (err is WebException )
                    {
                        if (this.UpdateHttpRequestError != null)
                        {
                            this.UpdateHttpRequestError(this, new EventArgs());
                        }
                        if (this.UpdateCompleted != null)
                        {
                            this.UpdateCompleted(this, new UpdateCompletedEventArgs(this.savePath, this.requestUrl));
                        }
                    }
                    Console.WriteLine("下载过程出现错误:" + err.ToString());
                    fileStream.Close();
                }
            }
      

  5.   


    class UpdateProgressEventArgs : EventArgs
        {
            private int progressValue;        public UpdateProgressEventArgs(int progressValue)
            {
                this.progressValue = progressValue;
            }        public int ProgressValue
            {
                get
                {
                    return this.progressValue;
                }
            }
    }
    class UpdateRequest
        {
            #region 事件
            //文件下载完毕运行的委托事件
            public delegate void UpdateCompletedEventHandler(object sender, UpdateCompletedEventArgs e);
            public event UpdateCompletedEventHandler UpdateCompleted;
            //文件下载中更新进度的委托事件
            public delegate void UpdateProgressEventHandler(object sender, UpdateProgressEventArgs e);
            public event UpdateProgressEventHandler UpdateProgress;
            //请求远程服务器出错的委托事件
            public delegate void UpdateHttpRequestErrorEventHandler(object sender, EventArgs e);
            public event UpdateHttpRequestErrorEventHandler UpdateHttpRequestError;
    }全部代码有几个 以前做的 大概思路就是这样吧
      

  6.   

    好象问题已经解决了....学习下    其实我做的时候  都是根据文件的个数来判断的
    也就是  以传个数/总个数 =value  总个数 是最大值然后timer 定时  刷一下进度...
    我是小菜鸟!   说的不好清见谅,   希望能够帮到你!