//打开对话框选择文件

        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. Kali linux安装漏洞扫描工具Nessus指南

    引子:Nessus是著名信息安全服务公司tenable推出的一款漏洞扫描与分析软件,号称是"世界上最流行的漏洞扫描程序,全世界超过75,000个组织在使用它".虽然这个扫描程序能够 ...

  2. 深度学习工具caffe具体安装指南

    caffe安装指南-吐血整理 前言: 在一台系统环境较好的linux机器上能够非常easy的安装caffe,可是假设系统本身非常旧,又没有GPU的话.安装就太麻烦了,全部都得从头做起,本文档旨在尽可能 ...

  3. 算法精解(C语言描述) 第5章 读书笔记

    第5章 5.1 单链表 /* -------------------------------- list.h -------------------------------- */ #ifndef L ...

  4. web前端学习之路

    test 随着自己对于web前端知识了解的越多,越来越发现自己真的好菜 一脸茫然阶段 两年前大学接触网页设计,那时对于网页设计一窍不通,只是看了一本自己大学编的一本入门教材,我甚至不知道那些网页设计的 ...

  5. JAVA里的String、Timestamp、Date相互转换

    Timestamp转化为String: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//定义 ...

  6. 浅谈Mybatis(三)

    一.动态SQL 1.sql片段 解决sql语句的冗余代码问题. <sql id="SELECT_T_USER"> select id,name,password,bir ...

  7. HDU OJ 5317 RGCDQ( 2015多校联合训练第3场) 暴力打表+小技巧

    题目连接:Click here 题意:在一个[L,R]内找到最大的gcd(f[i],f[j])其中L<=i<j<=R,f[x]表示i分解质因数后因子的种类数.eg:f[10]=2(1 ...

  8. USACO Section 5.1 Musical Themes(枚举)

    直接枚举O(n^3)会TLE,只要稍微加点优化,在不可能得到更优解时及时退出.其实就是道水题,虽说我提交了6次才过= =..我还太弱了 -------------------------------- ...

  9. hadoop搭建杂记:Linux下不同linux主机之间文件copy的scp命令

    不同的Linux之间copy文件常用有3种方法: 不同的Linux之间copy文件常用有3种方法: ①ftp 就是其中一台Linux安装ftp Server,这样可以另外一台使用ftp的程序来进行文件 ...

  10. 本地环境下 WordPress 环境搭建与安装

    本地环境:Ubuntu 14.04 使用软件: WordPress 4.1.1 中文优化版 EasyEngine 安装步骤: 安装 LNMP 环境; wget -qO ee rt.cx/ee & ...