//打开对话框选择文件

        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. nodejs开发微信1——微信路由设置a(access_token和tickets)

    /* jshint -W079 */ /* jshint -W020 */ "use strict"; var _ = require("lodash"); v ...

  2. freemaker

    FreeMarker模板文件主要由如下4个部分组成:  1,文本:直接输出的部分  2,注释:<#-- ... -->格式部分,不会输出  3,插值:即${...}或#{...}格式的部分 ...

  3. 差一本CSS 3的书,有兴趣的作者来写

    最近出版了一套CSS图书,但是缺一个CSS 3作者,是要独立写一本书的,所以要求作者务必有2年以上的经验,有写作时间和写作爱好 平时写BLOG者优先 有兴趣的可以联系Q:1602943293,验证:写 ...

  4. 如何在VMware虚拟机上安装Linux操作系统(Ubuntu)

    作为初学者想变为计算机大牛非一朝一夕,但掌握基本的计算机操作和常识却也不是多么难的事情.所以作为一名工科男,为了把握住接近女神的机会,也为了避免当白痴,学会装系统吧!of course为避免把自己的电 ...

  5. WCF:System.Security.Cryptography.CryptographicException: 密钥集不存在

    WCF使用IIS部署时,使用x509证书验证,在创建证书并正确配置程序后,访问出现错误提示: System.Security.Cryptography.CryptographicException: ...

  6. Matlab中边缘提取方法简析

    1.Matlab简述 Matlab是国际上最流行的科学与工程计算的软件工具,它起源于矩阵运算,已经发展成一种高度集成的计算机语言.有人称它为“第四代”计算机语言,它提供了强大的科学运算.灵活的程序设计 ...

  7. (转)Java通过axis调用WebService

    转自:http://blog.csdn.net/wanglha/article/details/49679825 转载地址:http://www.linuxidc.com/Linux/2015-06/ ...

  8. BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

    树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...

  9. Servlet基础知识(一)——Servlet的本质

    什么是Servlet: Servlet是运行在web服务器端(web容器,如tomcat)的程序,它与Applet相对,Applet是运行在客户端的程序. Servlet的主要作用是处理客户端的请求, ...

  10. Easyui + jQuery表单提交 给 Controller patr1

    2014-11-15  总结上周在公司开发所用到的技术,由于是刚找的工作(一个大三实习生)+自己的技术菜,有很多地方都是怎么想就怎么实现的, 如果你有什么更好的解决方法,在看见这篇博客的时候,希望你能 ...