//打开对话框选择文件

        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. poj2583---Series Determination

    #include <stdio.h> #include <stdlib.h> int main() { int x,y,z,a,b,c; while(scanf("% ...

  2. npm 常用命令

    npm install xxx 安装模块npm install xxx@1.1.1   安装1.1.1版本的xxxnpm install xxx -g 将模块安装到全局环境中.npm ls 查看安装的 ...

  3. mysql主从切换步骤

    1>   正常切换 1)从server检查SHOW PROCESSLIST语句的输出,直到你看到Has read all relaylogwaiting for the slave I/O th ...

  4. C#实现按Word模板导出Word(加书签bookMark)

    本方法是针对word导出操作,需要制作好的模板文件 模板.doc 引入应用Microsoft.Office.Interop.Word 11.0  (office2003) 导出文件注意:有时候迅雷会在 ...

  5. 桦仔 笔记4-徐 模仿灾难发生时还原adventurework数据库 示例 stopat

    1 --模仿灾难发生时还原adventurework数据库 示例 stopat 2 3 BACKUP DATABASE AdventureWorks 4 TO DISK= 'D:\MSSQL\Data ...

  6. T-SQL语句中中括号([])的用法是什么,什么时候该用

    加了[]是为了防止歧义,使计算机能识别.有些字段可能是关键字,这时候你直接用字段名就会报错,如果加了[]就可以正常执行了

  7. 寻找所有javaee官方文档的方法

    所有跟java有关的首先要去oracle官网. 所有文档都放在: Oracle Technology Network 即:著名的OTN网站 链接在首页的最后一个标签: 侧面就是documentions ...

  8. SQL标识列的查询

        1.判段一个表是否具有标识列    www.2cto.com   可以使用 OBJECTPROPERTY 函数确定一个表是否具有 IDENTITY(标识)列,用法: Select OBJECT ...

  9. 常用的Linux操作命令(一)

    ls 目录 mkdir 创建文件夹 vi 新建文件 :w filename 将文章存入指定的文件名filename :wq 保存并退出编辑文件 :q! 强制离开并放弃编辑的文件 cd 切换到目录/ro ...

  10. 一周学会Mootools 1.4中文教程:(7)汇总收尾

    转眼之间已经第七课了,这也将成为最后一课,如果这7课下来您感觉水平没有达到预想的水平,没关系您可以继续关注本站的博文,我会陆续发一些类似的文章帮您提升水平,另外我最近打算和群里的几个Mootools爱 ...