这是对上篇博文提到的IAsyncResult异步调用模式的一个实例应用,所用到的知识有:
- 通过异步回调函数实现异步操作
- 通过类实现给异步回调函数传递附加信息
- 在子线程中通过异步回调的方式通知主线程执行结果
- WebRequest和WebResponse的操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Windows.Forms;
namespace DownLoadPageFromWeb
{
class Program
{
/// <summary>
/// 异步回调函数
/// </summary>
/// <param name="ar"></param>
static void DownloadFinished(IAsyncResult ar)
{
try
{
//传入回调函数的附加信息可以通过IAsyncResult.AsyncState接收
DownLoadTask task = ar.AsyncState as DownLoadTask;
WebResponse response = task.WebRequestObject.EndGetResponse(ar);
string FileContent="";
//从internet返回需要的输入流
using(StreamReader reader=new StreamReader(response.GetResponseStream(),Encoding.GetEncoding("gb2312")))
{
FileContent = reader.ReadToEnd();
}
//写入文件
using (StreamWriter writer = new StreamWriter(new FileStream(task.SaveToFileName, FileMode.Create), Encoding.GetEncoding("gb2312")))
{
writer.Write(FileContent);
}
MessageBox.Show(string.Format("“{0}”下载完成!", task.SaveToFileName));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
static void Main(string[] args)
{
string UserInputUrl = "";
string FileName = "";
Console.WriteLine("输入URL启动一个异步下载Web文件任务,输入quit退出。");
do
{
Console.Write("\n输入Web文件的URL:");
UserInputUrl = Console.ReadLine();
if (string.IsNullOrEmpty(UserInputUrl))
{
Console.WriteLine("不能输入一个空的URL字串");
continue;
}
if (UserInputUrl.ToLower() == "quit")
break;
Console.Write("输入要保存的文件名:");
FileName = Console.ReadLine();
if (string.IsNullOrEmpty(FileName))
{
Console.WriteLine("不能输入一个空的URL字串");
continue;
}
if (FileName.ToLower() == "quit")
break;
if (UserInputUrl.ToLower() == "quit")
break;
try
{
Uri webFileUri = new Uri(UserInputUrl);
WebRequest webRequest = WebRequest.Create(webFileUri);
//DownLoadTask用于向回调函数传递附加信息
DownLoadTask task = new DownLoadTask { SaveToFileName = FileName, WebRequestObject = webRequest };
Console.WriteLine("已在后台启动下载{0}", FileName);
//BeginGetResponse 方法开始对 Internet 资源响应的异步请求。异步回调方法使用 EndGetResponse 方法返回实际的 WebResponse。第一个参数是AsyncCallback 委托(回调函数),第二个参数是附加信息
webRequest.BeginGetResponse(DownloadFinished, task);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} while (true);
Console.WriteLine("\n敲任意键结束本示例程序...");
Console.ReadKey();
}
}
}
输入一个URI,再输入一个文件,将指定的URI的内容下载保存在文件中!
分享到:
相关推荐
.net dotnet C# Socket 同步,异步 编程实例
C# 5.0 异步编程技术,关注C#新的异步编程特性。
C#Socket同步,异步编程实例
Windows 应用程序编程中常见的一个模式就是,在GUI用户界面下,将耗时的文件和网络处理放入 子线程,以避免用户界面不能响应的问题。在.NET出现以前,创建线 程并监视线程结束,还要更新 界面等工作,即复杂又要手写...
通过实例说明c#中同步和异步的区别,适合于初学者,能够帮助理解同步和异步的概念。
Visual C#学习笔记光盘 简介:本书由浅入深地讲解Visual C# 2005编程知识,全书内容分为6篇,共27章,第一篇介绍Visual Studio 2005开发环境和C#基础,其中包括Visual C# 2005简介,C#语言基础,面向对象编程...
这是我自己写的C#异步编程方式以及简单示例: 包含委托、task、await async 方式来实现异步。
C#Udp同步和异步编程源代码,代码中有详细注释,在VS2010平台下正常运行,使用网络调试助手调试通过,注意根据自己的电脑修改IP地址
Socket异步编程源代码与资料 Socket C#通讯
Microsoft相信分布式应用程序是未来的趋势,即处理过程分布在客户端和服务器上
学习C#异步编程技巧和实现原理,提升异步编程的质量
我们将在这里进一步讨论一些.NET类,以及他们在多线程编程中扮演的角色和怎么编程。它们是: System.Threading.ThreadPool 类 System.Threading.Timer 类 如果线程的数目并不是很多,而且你想控制每个线程的...
异步模式分为3种:异步模式、基于事件的异步模式和基于任务的异步模式(TAP)。TAP是利用关键字async和await实现的,本文将讲解TAP模式。async和await关键字只是编译器的功能。编译器最终会用Task类创建代码。 1、...
C#异步编程官网手册[收集].pdf
C# Socket异步编程资料的一个打包全集,里面有文档,有源码例子
#6.0学习笔记 从第一行C#代码到第一个项目设计周家安著,高清书签
编程学习笔记(数据库,C#)编程学习笔记(数据库,C#)编程学习笔记(数据库,C#)编程学习笔记(数据库,C#)编程学习笔记(数据库,C#)编程学习笔记(数据库,C#)编程学习笔记(数据库,C#)编程学习笔记(数据库,C#)...
C#学习笔记网络篇
C#学习笔记(非常经典)很多前辈推荐的。希望能对大家有帮助。
C#异步Task编程模型实战技巧,异步Task实战实例分享