//打开对话框选择文件

        private void OpenDialogBox_Click(object sender, RoutedEventArgs e)
        {
            var openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "*|*";
            openFileDialog.RestoreDirectory = true;
            openFileDialog.ShowDialog();
            //包含路径的文件名
            var fileNames = openFileDialog.FileName;
            //文件名
            var name = openFileDialog.SafeFileName;
            DownLoadBox.Text = fileNames;
            DownLoadBox.Tag = name;
        }
 
        //点击下载下载文件
        private void DownLoadButton_Click(object sender, RoutedEventArgs e)
        {
            string filePath = DownLoadBox.Text;
            string name = DownLoadBox.Tag.ToString();
            if (string.IsNullOrEmpty(name)) return;
            if (filePath == null) return;
            var file = new FileInfo(filePath);
            //取到文件的总想长度
            long length = file.Length;
 
            #region 添加进度条
            var stackpael = new StackPanel()
                {
                    Margin = new Thickness(0, 3, 0, 5)
                };
 
            var lable = new System.Windows.Controls.Label();
 
            var progressbar = new ProgressBar()
            {
                Margin = new Thickness(10, 10, 0, 13),
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment = VerticalAlignment.Top,
                Width = 300,
                Height = 30,
                Maximum = length
            };
 
            stackpael.Children.Add(lable);
            stackpael.Children.Add(progressbar);
            DownLoadStackPanel.Children.Add(stackpael);
            //创建实体,以方便多线程传值
            Controls control = new Controls();
            control.Lable = lable;
            control.Name = name;
            control.Progressbar = progressbar;
            control.Path = filePath; 
            #endregion
 
            //使用线程池下载文件
            ThreadPool.QueueUserWorkItem(new WaitCallback(DownLoad), control);
 
        }
 
        #region 使用线程池下载文件void DownLoad(object control)
        /// <summary>
        /// 使用线程池下载文件
        /// </summary>
        /// <param name="control"> 参数</param>
        private void DownLoad(object control)
        {
            var controls = control as Controls;
            string name = controls.Name;
            string filePath = controls.Path;
            System.Windows.Controls.Label lable = controls.Lable;
            ProgressBar progressBar = controls.Progressbar;
            //存放下载文件的路径
            string newPath = Path.GetFullPath("../../File");
            if (name == null || filePath == null || lable == null || progressBar == null) return;
            //下载
            DownLoadFile(name, filePath, newPath, lable, progressBar);
        } 
        #endregion
 
        #region 下载void DownLoadFile(string name, string filePath, string newPath, System.Windows.Controls.Label lable, ProgressBar progressBar)
        /// <summary>
        /// 下载
        /// </summary>
        /// <param name="name">文件名</param>
        /// <param name="filePath">文件路径</param>
        /// <param name="newPath">存放文件的路径</param>
        /// <param name="lable">存放文件名的控件</param>
        /// <param name="progressBar">进度条</param>
        private void DownLoadFile(string name, string filePath, string newPath, System.Windows.Controls.Label lable, ProgressBar progressBar)
        {
            newPath = newPath + "\\" + Guid.NewGuid() + name;
            //FileMode.Create创建文件   FileMode.Open 打开文件
            using (Stream so = new FileStream(newPath, FileMode.Create))
            {
                using (Stream st = new FileStream(filePath, FileMode.Open))
                {
                    byte[] by = new byte[1024 * 1024 * 100];
                    int osize = st.Read(by, 0, (int)by.Length);
                    int lengths = osize;
                    //被主线程调用
                    Action a = () =>
                    {
                        lable.Content = name;
                    };
                    this.Dispatcher.BeginInvoke(a);
 
                    while (osize > 0)
                    {
                        so.Write(by, 0, osize);
                        osize = st.Read(by, 0, (int)by.Length);
                        lengths += osize;
                        Action action = () =>
                        {

//进度条

                            progressBar.Value = lengths;
                        };
                        progressBar.Dispatcher.BeginInvoke(action);
                    }
                }
            }
        } 
        #endregion

WPF多线程下载文件,有进度条的更多相关文章

  1. C# WPF 解压缩7zip文件 带进度条 sevenzipsharp

      vs2013附件 :http://download.csdn.net/detail/u012663700/7427461 C# WPF 解压缩7zip文件 带进度条 sevenzipsharp W ...

  2. VC下载文件显示进度条

    VC下载文件显示进度条 逗比汪星人2009-09-18上传   by Koma http://blog.csd.net/wangningyu http://download.csdn.net/deta ...

  3. Android开发(24)---安卓中实现多线程下载(带进度条和百分比)

    当我们学完java中多线程的下载后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java package com.example.downloads; import ...

  4. VC下载文件 + 显示进度条

    在codeproject里找了许久,发现这样一个VC下载文件并显示进度条的源码,于是添加了些中文注释: 1.下载线程函数: UINT DownloadFile(LPVOID pParam) { CWn ...

  5. webclient下载文件 带进度条

    private void button1_Click(object sender, EventArgs e) { doDownload(textBox1.Text.Trim()); } private ...

  6. UrlDownloadFile, 线程下载文件, 带进度条

    unit FileDownLoadThread; interface uses Classes, SysUtils, Windows, ActiveX, UrlMon; const S_ABORT = ...

  7. libcurl开源库在Win32程序中使用下载文件显示进度条实例

    一.配置工程引用libcurl库 #define CURL_STATICLIB #include "curl/curl.h" #ifdef _DEBUG #pragma comme ...

  8. Android 下载文件 显示进度条

    加入两个权限 一个是联网,另一个是读写SD卡 <uses-permission android:name="android.permission.INTERNET">& ...

  9. axios 如何获取下载文件的进度条

    exportFun(){         let _that = this         const instance = this.axios.create({           onDownl ...

随机推荐

  1. Android SQLite 事务处理

    应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作.我 ...

  2. 新辰:4G时代怎样利用手机进行移动APP营销?

    未来的时代是4G时代,新辰手机用户的搜索量不在电脑端之下.那么,我们要怎样用手机进行营销呢?手机站点的竞价文章,要怎样去写比較好?手机站点要做专题吗?手机站点的优化思路在哪里?手机的系统不同,在不同的 ...

  3. SQL学习之使用常用函数处理数据

    一.在介绍使用函数处理数据前,先说下使用DBMS(数据库管理系统)处理数据所带来的问题! 1.与几乎所有的DBMS都同等的支持SQL语句(如SELECT)不同,每一个DBMS都有特定的函数,事实上,只 ...

  4. 学习ExtjsForVs(第一个案例HelloWord)

    第一个案例-Hello Word 1.本次练习以ext-4.0.7为例,首先从网上下载ext包. 2.打开包后将里面的三个文件或文件夹拷贝到项目中. resource文件夹 bootstrap.js ...

  5. 关于SVM一篇比较全介绍的博文

    转自:http://blog.csdn.net/v_july_v/article/details/7624837 支持向量机通俗导论(理解SVM的三层境界) 前言 动笔写这个支持向量机(support ...

  6. ORACLE查看当前连接用户的权限信息或者角色信息

    关于当前用户的相关信息,可以通过如下语句找到: SQL> select * from all_objects where object_name like 'SESSION%'; OWNER O ...

  7. Web颜色搭配 - 收集

    颜色1  颜色一   背景 字 RGB 43,41,46 92,187,207 HEX #2B292E #5CBBCF HSB 264,11,18 190,56,81 CMYK 7,11,0,82 5 ...

  8. 计算BMI指数的小程序

    小明身高1.75,体重80.5kg.请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: 低于18.5:过轻 18.5-25:正常 25-28:过重 28-32:肥胖 高 ...

  9. 使用 http://httpbin.org/ 验证代理地址

    发现一个很方便的工具,在Linux 下使用  curl  http://httpbin.org/   可以返回当前使用的一些网络信息

  10. ortoiseSVN无法编辑日志信息的解决方法

    提交时忘记编写日志,想重新编辑日志信息,弹出错误提示: DAV 请求失败:可能是版本库的 pre-revprop-change 钩子执行失败或者不存在 至少有一个属性变更失败:版本库未改变 设置属性  ...