目录
一、同步下载
直接上代码
先导入命名空间
using System.IO;
/// <summary>
/// 下载文件函数
/// </summary>
/// <param name="url">下载链接</param>
/// <param name="filePath">返回文件路径</param>
/// <returns>bool</returns>
public bool download(string url,ref string filePath)
{
Console.WriteLine("下载");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response != null)
{
Stream stream = response.GetResponseStream();//获取响应的流
//判断不是文本形式就下载写入
if (!response.ContentType.ToLower().StartsWith("text/"))
{
if (!Directory.Exists(@"temp\"))//判断文件夹是否存在
Directory.CreateDirectory(@"temp\");
FileStream outStream = File.Create(@"temp/m3u8.txt");//创建文件
filePath = @"temp/m3u8.txt";
Stream inStream = response.GetResponseStream();
Console.WriteLine(response.GetResponseStream());
byte[] buffer = new byte[1024];
int i;
do
{
i = inStream.Read(buffer, 0, buffer.Length);
if(i > 0)
outStream.Write(buffer, 0, i);
} while (i > 0);
outStream.Close();
inStream.Close();
}
return true;
}else
return false;
}
ref string filePath这个形参可以不用管,他是返回路径,写多了的
使用
if (download(text_url.Text.Trim(), ref filePath))
{
MessageBox.Show("下载成功");
}
else
MessageBox.Show("下载失败");
问题:上面的方式下载会导致什么问题呢,答案是在下载过程中,其他任务将会全部等待,包括窗口的拖动,那么就显得卡住了一样,直到下载完成。
二、异步下载
这个就刚好解决了上面的问题
我们新创建一个函数,来定义异步,通过task
/// <summary>
/// 异步下载
/// </summary>
/// <returns></returns>
public async Task downloadAsync()
{
await Task.Run(() => download(text_url.Text.Trim(), ref filePath));
Console.WriteLine("下载中");
}
使用
Console.WriteLine("开始");
await downloadAsync();
Console.WriteLine("结束");
加了await 那么该线程就会等待到downloadAsync()方法执行完成后再往下执行,简称同步