一、前言
在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;
}
}
}
}