使用C#的异步编程可以非常方便地完成下载文件的功能。异步编程是指一种编程模型,其中某些操作不会阻塞程序的执行,而是在异步线程中执行。这种方式可以提高程序的性能,并且可以避免阻塞其他操作的执行。在下载文件的情境下,使用异步编程可以保证下载进程的顺利进行,而不会导致整个程序的崩溃。
不带返回例子
C#internal class Program
{
static async Task Main(string[] args)
{
await DownloadHtmlAsync("http://www.baidu.com", "baidu.txt");
}
static async Task DownloadHtmlAsync(string url, string filename)
{
using (HttpClient client = new HttpClient())
{
string html = await client.GetStringAsync(url);
await File.WriteAllTextAsync("./" + filename, html);
}
}
}
修改成带返回
C#static async Task Main(string[] args)
{
var len= await DownloadHtmlAsync("http://www.baidu.com", "baidu.txt");
Console.WriteLine(len);
}
static async Task<int> DownloadHtmlAsync(string url, string filename)
{
using (HttpClient client = new HttpClient())
{
string html = await client.GetStringAsync(url);
await File.WriteAllTextAsync("./" + filename, html);
return html.Length;
}
}
用winform实现
C#private async void btnDownload_Click(object sender, EventArgs e)
{
await DownloadFile("http://www.baidu.com", "baidu.txt");
}
private async Task DownloadFile(string url, string filename)
{
using (HttpClient client = new HttpClient())
{
var html = await client.GetStringAsync(url);
await File.WriteAllTextAsync("./" + filename, html);
}
}
这里注意click事件前的void不能修改成Task
如果遇到不在在调用程序中使用async,可以用Wait()(无返回值)Result(有返回值)。风险:死锁,尽量不用。
C#private void btnRun_Click(object sender, EventArgs e)
{
int count = 0;
ThreadPool.QueueUserWorkItem((obj) =>
{
while (true)
{
count++;
this.Invoke(new Action(() =>
{
txtValue.Text = count.ToString();
}));
Thread.Sleep(100);
}
});
}
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!