使用C#制作Windows窗体应用,实现一个微端下载器功能(多线程/断点续传/微端/下载器)

C# 同时被 2 个专栏收录
74 篇文章 2 订阅
61 篇文章 0 订阅

一、前言

PC端的QQ游戏大厅下载游戏的时候,我们会发现很多游戏都自己做了微端下载器,就是在先下载一个1~2M的下载器,然后再通过这个下载器去下载游戏。
那么,微端下载器用什么来制作呢?可以有很多制作方案。
本文我教你通过C#制作Windows窗体应用来实现微端下载器功能。

二、最终运行效果

如下, 最终运行效果
在这里插入图片描述
我把窗口的标题栏隐藏了,因为默认的标题栏不是很好看,如果想显示标题栏,只需将工程中的Form1.cs中下面这行代码注释掉即可。
在这里插入图片描述
发布出来的Release版本只有555KB,相对于一两百兆的游戏来说微端可以秒触达用户。
在这里插入图片描述

三、Demo工程下载

Demo工程我已上传到CODE CHINA,感兴趣的同学可以下载下来学习。
Demo工程下载地址:https://codechina.csdn.net/linxinfa/winform-download-demo
在这里插入图片描述

四、工程类型

如果你是自己制作,创建工程的时候,选择C# - Winodows - 桌面,创建Windows 窗体应用(.NET Framework)
在这里插入图片描述

五、工程结构

工程结构非常简单,如下
在这里插入图片描述
Program.cs是程序入口,Form1.cs是主窗口,DownloadThread.cs是下载逻辑。
注意,Form1.Designer.cs是可视化界面自动生成出来的代码。
在这里插入图片描述

六、多线程下载核心代码

多线程下载核心代码如下,具体代码可以Demo工程进行学习。
注:Demo中我下载完后执行了zip解压,所以用到了一个第三方库Ionic.Zip.Unity.dll,如果你不不需要解压,可以去掉这个dll和对应的逻辑。

using System;
using System.IO;
using System.Net;

namespace winform1
{
    class DownloadThread
    {
        /// <summary>
        /// 线程开始事件
        /// </summary>
        public event EventHandler threadStartEvent;
        /// <summary>
        /// 线程执行时事件
        /// </summary>
        public event EventHandler threadEvent;
        /// <summary>
        /// 线程结束事件
        /// </summary>
        public event EventHandler threadEndEvent;

        /// <summary>        
        /// c#,.net 下载文件        
        /// </summary>        
        /// <param name="url">下载文件地址</param>       
        /// <param name="filename">下载后的存放地址</param>     
        public void RunMethod(string url, string filename)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                //通知主界面,我开始了, response.ContentLength用来设置进度条的最大值
                threadStartEvent.Invoke(response.ContentLength, null);

                Stream st = response.GetResponseStream();
                Stream so = new FileStream(filename, FileMode.Create);
                long totalDownloadedByte = 0;
                byte[] by = new byte[1024];
                int osize = st.Read(by, 0, by.Length);
                while (osize > 0)
                {
                    totalDownloadedByte += osize;
                    so.Write(by, 0, osize);
                    osize = st.Read(by, 0, by.Length);

                    //通知主界面我正在执行,totalDownloadedByte表示进度条当前进度
                    threadEvent.Invoke(totalDownloadedByte, null);
                }
                so.Close();
                st.Close();

                //通知主界面我已经完成了
                threadEndEvent.Invoke(null, null);
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值