网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月11日漏签0天
c#吧 关注:188,844贴子:824,895
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 5回复贴,共1页
<<返回c#吧
>0< 加载中...

学习笔记-------------异步编程模型

  • 只看楼主
  • 收藏

  • 回复
  • 呐呐不是奈奈
  • c#攻城狮
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
APM就是异步编程模型的缩写
APm最具代表性的特点就是:一个异步功能由以Begin开头,end开头的两个方法
Begin开头的方法表示启动异步功能的执行,end表示结束并且返回执行结果
。异步编写模型是一种模式,该模式允许用更少的线程去做更多的操作,
.NET Framework很多类也实现了该模式,同时我们也可以自定义类来实现该模式,
(也就是在自定义的类中实现返回类型为IAsyncResult接口的BeginXXX方法和EndXXX方法),
另外委托类型也定义了BeginInvoke和EndInvoke方法,并且我们使用WSDL.exe和SvcUtil.exe
工具来生成Web服务的代理类型时,也会生成使用了APM的BeginXxx和EndXxx方法。
FileStream类
// 开始异步读操作
// 前面的3个参数和同步方法代表的意思一样,这里就不说了,可以看到这里多出了2个参数
// userCallback代表当异步IO操作完成时,你希望由一个线程池线程执行的方法,该方法必须匹配AsyncCallback委托
// stateObject代表你希望转发给回调方法的一个对象的引用,在回调方法中,可以查询IAsyncResult接口的AsyncState属性来访问该对象
public override IAsyncResult BeginRead(byte[] array, int offset, int numBytes, AsyncCallback userCallback, Object stateObject
)
如果你在使用该异步方法时,不希望异步操作完成后调用任何代码,你可以把userCallback参数设置为null
FileStream的EndRead方法返回一个Int32来代表从文件流中实际读取的字节数。
对于访问异步操作的结果,APM提供了四种方式供开发人员选择:
在调用BeginXxx方法的线程上调用EndXxx方法来得到异步操作的结果,但是这种方式会阻塞调用线程,知道操作完成之后调用线程才继续运行
查询IAsyncResult的AsyncWaitHandle属性,从而得到WaitHandle,然后再调用它的WaitOne方法来使一个线程阻塞并等待操作完成再调用EndXxx方法来获得操作的结果。
循环查询IAsyncResult的IsComplete属性,操作完成后再调用EndXxx方法来获得操作返回的结果。
使用 AsyncCallback委托来指定操作完成时要调用的方法,在操作完成后调用的方法中调用EndXxx操作来获得异步操作的结果。
在上面的4种方式中,第4种方式是APM的首选方式,因为此时不会阻塞执行BeginXxx方法的线程,然而其他三种都会阻塞调用线程,相当于效果和使用同步方法是一样,个人感觉根本失去了异步编程的特点,所以其他三种方式可以简单了解下,在实际异步编程中都是使用委托的方式。


青铜星玩家
百度移动游戏玩家均可认证(限百度账号),去领取
活动截止:2100-01-01
去徽章馆》
  • 呐呐不是奈奈
  • c#攻城狮
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 异步编程
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Text = "http://files.tieba.baidu.com/zhili/APM.rar ";
}
/// <summary>
/// 定义一个委托
/// </summary>
/// <param name="fileUrl"></param>
/// <returns></returns>
private delegate string AsyncMethodCaller(string fileUrl);
SynchronizationContext Sc;//定义一个空的同步上下文对象
private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = "下载中。。。。。。";
button1.Enabled = false;
if (string.IsNullOrEmpty(textBox1.Text))
{
MessageBox.Show("没有下载地址");
return;
}
Sc = SynchronizationContext.Current;//获得调用线程的同步上下文
AsyncMethodCaller caller = new AsyncMethodCaller(DownloadFile);
caller.BeginInvoke(textBox1.Text.Trim(), GetResult, null);
}
private string DownloadFile(string fileUrl)
{
int bufferSize = 2048;
byte[] bufferRead = new byte[bufferSize];
string savepath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\mydownload.zip";
FileStream fileStream = null;//文件读取类
HttpWebResponse httpWebResponse = null;//HttpWebResponse类的作用用于在客户端获取返回的响应的信息
if (File.Exists(savepath))
{
MessageBox.Show("文件已存在");
return "文件已下载";
}
fileStream = new FileStream(savepath, FileMode.OpenOrCreate);//实例化filestream
try
{
HttpWebRequest myhttpWebResquest = (HttpWebRequest)WebRequest.Create(fileUrl);//HttpWebRequest这个类非常强大,强大的地方在于它封装了几乎HTTP请求报文里需要用到的东西,以致于能够能够发送任意的HTTP请求并获得服务器响应(Response)信息
if (myhttpWebResquest != null)
{
httpWebResponse = (HttpWebResponse)myhttpWebResquest.GetResponse();//决不要直接创建 HttpWebResponse 类的实例。而应当使用通过调用 HttpWebRequest.GetResponse 所返回的实例。
Stream responseStream = httpWebResponse.GetResponseStream();//获取Internet 资源数据流。
int readSize = responseStream.Read(bufferRead, 0, bufferSize);
while (readSize > 0)
{
fileStream.Write(bufferRead, 0, readSize);
readSize = responseStream.Read(bufferRead, 0, bufferSize);
}
}
return string.Format("文件下载完成,/r/n 文件大小为:{0},/r/n保存路径为{1}.", fileStream.Length, savepath);
}
catch(Exception ex)
{
return string.Format("发生异常异常为{0}", ex.Message);
}
finally//释放资源
{
if (httpWebResponse != null)
{
httpWebResponse.Close();
}
if (fileStream != null)
{
fileStream.Close();
}
}
}
private void GetResult(IAsyncResult Result)
{
AsyncMethodCaller caller = (AsyncMethodCaller)((AsyncResult)Result).AsyncDelegate;
// 调用EndInvoke去等待异步调用完成并且获得返回值
// 如果异步调用尚未完成,则 EndInvoke 会一直阻止调用线程,直到异步调用完成
string returnstring = caller.EndInvoke(Result);
textBox2.Text = returnstring;
}
private void ShowState(object result)
{
textBox2.Text = result.ToString();
button1.Enabled = true;
}
}
}


青铜星玩家
百度移动游戏玩家均可认证(限百度账号),去领取
活动截止:2100-01-01
去徽章馆》
2026-03-11 03:22:39
广告
不感兴趣
开通SVIP免广告
  • 呐呐不是奈奈
  • c#攻城狮
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
结束,异步编程模型(APM)虽然是.NET 1.0中提出来的,模式老旧看看就行了


青铜星玩家
百度移动游戏玩家均可认证(限百度账号),去领取
活动截止:2100-01-01
去徽章馆》
  • 呐呐不是奈奈
  • c#攻城狮
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
解决的问题也就是执行耗时任务时防止主线程卡住,提升一下用户体验


青铜星玩家
百度移动游戏玩家均可认证(限百度账号),去领取
活动截止:2100-01-01
去徽章馆》
  • 正怒月神
  • c#诠释者
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
现在不是流行 async/await吗。
为了让异步更贴近同步的书写方式,也让人更容易理解


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 5回复贴,共1页
<<返回c#吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示