Windows Phone 7 异步编程模型
Windows Phone 7上的异步编程模型其实也就是说把C#里面的异步编程模型在Windows Phone 7应用开发上使用。下面来看一下异步编程模型里面的一些关键的概念。
2个方法和一个委托和一个接口:
(1)BeginInvoke方法用于启动异步调用
Begin 方法包含同步方法签名中的任何参数,此外还包含另外两个参数:一个AsyncCallback 委托和一个用户定义的状态对象。委托用来调用回调方法,状态对象是用来向回调方法传递状态信息。
BeginInvoke立即返回,不等待异步调用完成。
BeginInvoke返回IasyncResult,可用于监视调用进度。
(2)EndInvoke方法用于检索异步调用结果。
End 方法用于结束异步操作并返回结果,因此包含同步方法签名中的 ref 和 out 参数,返回值类型也与同步方法相同。该方法还包括一个 IAsyncResult 参数,用于获取异步操作是否完成的信息,当然在使用时就必须传入对应的 Begin 方法返回的对象实例开始异步操作后如果要阻止应用程序,可以直接调用 End 方法,这会阻止应用程序直到异步操作完成后再继续执行。也可以使用 IAsyncResult 的 AsyncWaitHandle 属性,调用其中的WaitOne等方法来阻塞线程。这两种方法的区别不大,只是前者必须一直等待而后者可以设置等待超时。
如果不阻止应用程序,则可以通过轮循 IAsyncResult 的 IsCompleted 状态来判断操作是否完成,或使用 AsyncCallback 委托来结束异步操作。AsyncCallback 委托包含一个 IAsyncResult 的签名,回调方法内部再调用 End 方法来获取操作执行结果。
在调用BeginInvoke后可随时调用EndInvoke方法,注意:始终在异步调用完成后调用EndInvoke.如果异步调用未完成,EndInvoke将一直阻塞到异步调用完成。
EndInvoke的参数包括需要异步执行的方法的out和ref参数以及由BeginInvoke返回的IAsyncResult。要注意的是,始终在异步调用完成后调用EndInvoke
(3)AsyncCallback委托用于指定在开始操作完成后应被调用的方法
AsyncCallback委托被作为开始操作上的第二个到最后一个参数传递
代码原型如下:
[Serializable]
public delegate void AsyncCallback(IAsyncResult ar);
(4)IAsyncResult接口
它表示异步操作的状态.
该接口定义了4个公用属性
public interface IAsyncResult
{
object AsyncState { get; }
WaitHandle AsyncWaitHandle { get; }
bool CompletedSynchronously { get; }
bool IsCompleted { get; }
}
在Windows Phone 7上的应用
AsyncResultNoResult.cs
using System; using System.Threading;namespace AsyncTaskDemo {public class AsyncResultNoResult : IAsyncResult{private readonly AsyncCallback _asyncCallback;//异步请求的返回方法private readonly object _asyncState;//异步请求的对象private ManualResetEvent _asyncWaitHandle;//线程阻塞private Exception _exception;//操作异常private int _completedState;//完成状态private const int StateCompletedAsynchronously = 2;//异步完成private const int StateCompletedSynchronously = 1;//同步完成private const int StatePending = 0;/// <summary>/// 初始化/// </summary>/// <param name="asyncCallback">异步返回方法</param>/// <param name="state">异步调用对象</param>public AsyncResultNoResult(AsyncCallback asyncCallback, object state){this._asyncCallback = asyncCallback;this._asyncState = state;}/// <summary>/// 结束任务/// </summary>public void EndInvoke(){// This method assumes that only 1 thread calls EndInvoke // for this objectif (!this.IsCompleted)//任务未完成 {// If the operation isn't done, wait for itthis.AsyncWaitHandle.WaitOne();this.AsyncWaitHandle.Close();this._asyncWaitHandle = null; // Allow early GC }if (this._exception != null){RethrowException(this._exception);}}private static void RethrowException(Exception ex){throw ex;}public void SetAsCompleted(Exception exception, bool completedSynchronously){// Passing null for exception means no error occurred. // This is the common casethis._exception = exception;// The m_CompletedState field MUST be set prior calling the callbackif (Interlocked.Exchange(ref this._completedState, completedSynchronously ? 1 : 2) != 0){throw new InvalidOperationException("You can set a result only once", exception);}if (this._asyncWaitHandle != null){// If the event exists, set itthis._asyncWaitHandle.Set();}if (this._asyncCallback != null){// If a callback method was set, call itthis._asyncCallback(this);//调用异步请求的返回方法 }}/// <summary>/// 放弃异步请求的对象/// </summary>public object AsyncState{get{return this._asyncState;}}public WaitHandle AsyncWaitHandle{get{if (this._asyncWaitHandle == null){bool isCompleted = this.IsCompleted;ManualResetEvent event2 = new ManualResetEvent(isCompleted);if (Interlocked.CompareExchange<ManualResetEvent>(ref this._asyncWaitHandle, event2, null) != null){// Another thread created this object's event; dispose // the event we just created event2.Close();}else if (!isCompleted && this.IsCompleted){// If the operation wasn't done when we created // the event but now it is done, set the event//如果操作已经完成则释放阻塞this._asyncWaitHandle.Set();}}return this._asyncWaitHandle;}}//同步操作是否已经完成public bool CompletedSynchronously{get{return (this._completedState == 1);}}//是否已经完成public bool IsCompleted{get{return (this._completedState != 0);}}} }
AsyncResult.cs
using System;namespace AsyncTaskDemo {public class AsyncResult<TResult> : AsyncResultNoResult{private TResult m_result;//异步操作完成返回的对象public AsyncResult(AsyncCallback asyncCallback, object state): base(asyncCallback, state){this.m_result = default(TResult);}/// <summary>/// 停止异步返回返回对象/// </summary>/// <returns></returns>public TResult EndInvoke(){base.EndInvoke(); //等待操作完成 return m_result; // 返回结果 }/// <summary>/// 操作完成/// </summary>/// <param name="result">返回结果对象</param>/// <param name="completedSynchronously">是否同步操作</param>public void SetAsCompleted(TResult result, bool completedSynchronously){//保存异步操作的结果m_result = result;base.SetAsCompleted(null, completedSynchronously);}} }
TestTask.cs
using System; using System.Threading;namespace AsyncTaskDemo {public class TestTask{public TestTask(){}public IAsyncResult BeginTestTask(string text, AsyncCallback asyncCallback, object state){AsyncResult<string> asyncResult = new AsyncResult<string>(asyncCallback, state);ThreadPool.QueueUserWorkItem(DoTestTask, asyncResult);return asyncResult;}public string EndTestTask(IAsyncResult asyncResult){return ((AsyncResult<string>)asyncResult).EndInvoke();}private void DoTestTask(Object asyncResult){AsyncResult<string> ar = (AsyncResult<string>)asyncResult;try{Thread.Sleep(3000);ar.SetAsCompleted("测试完成", true);}catch (Exception e){ar.SetAsCompleted(e, false);}}} }
MainPage.xaml.cs
TestTask tt = new TestTask();WebTask webTask = new WebTask(new Uri("http://www.cnblogs.com/linzheng"));IAsyncResult ia;public MainPage(){InitializeComponent();}private void button1_Click(object sender, RoutedEventArgs e){Func<string, IObservable<string>> testResult = Observable.FromAsyncPattern<string, string>(tt.BeginTestTask, tt.EndTestTask);ObservableExtensions.Subscribe<string>(Observable.ObserveOnDispatcher<string>(testResult.Invoke("")),delegate(string success){MessageBox.Show(success);},delegate(Exception exception){MessageBox.Show(exception.Message);});}
运行的效果
转载于:https://www.cnblogs.com/linzheng/archive/2012/06/09/2543283.html
Windows Phone 7 异步编程模型相关推荐
- [你必须知道的异步编程]——异步编程模型(APM)
本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中介绍了从C#1.0--C#4.0中一些 ...
- 【转】1.6异步编程:IAsyncResult异步编程模型 (APM)
传送门:异步编程系列目录-- 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作.然而,这个技术存在许多限制.最大的问 ...
- C#异步编程-------异步编程模型(APM)
术语解释: APM 异步编程模型, Asynchronous Programming Model EAP 基于事件的异步编程模式, Event ...
- 异步编程模型(C#5.0系列)
关于C#5.0的新功能--async和await关键字.它们是语法糖,可以简化异步操作代码的构造.当C#编译器看到一个await表达式时,它会生成代码,该代码自动异步地调用该表达式,然后立即将控制流返 ...
- 《CLR Via C# 第3版》笔记之(二十一) - 异步编程模型(APM)
APM是.NET中异步编程模型的缩写(Asynchronous Programing Model). 通过异步编程,使得我们的程序可以更加高效的利用系统资源. 主要内容: 一个APM的例子 GUI中的 ...
- 异步编程模型--使用 IAsyncResult 对象
先推荐阅读下面的资料: MSDN:异步编程设计模式 IBM developerworks: 使用异步 I/O 大大提高应用程序的性能 参考博文: 1.正确使用异步操作 2.Lab:体会ASP.NET异 ...
- c# 三种异步编程模型EAP(*)、 APM(*)和 TPL
为什么80%的码农都做不了架构师?>>> EAP 是 Event-based Asynchronous Pattern(基于事件的异步模型)的简写 优点是简单,缺点是当实现复杂 ...
- 简单地使用线程之一:使用异步编程模型
.NetFramework的异步编程模型从本质上来说是使用线程池来完成异步的任务,异步委托.HttpWebRequest等都使用了异步模型. 这里我们使用异步委托来说明异步编程模型. 首先,我们来明确 ...
- 并行开发 —— 第六篇 异步编程模型
在.net里面异步编程模型由来已久,相信大家也知道Begin/End异步模式和事件异步模式,在task出现以后,这些东西都可以被task包装 起来,可能有人会问,这样做有什么好处,下面一一道来. 一: ...
- 【转】谈谈c#中异步编程模型的变迁**
大家在编程过程中都会用到一些异步编程的情况.在c#的BCL中,很多api都提供了异步方法,初学者可能对各种不同异步方法的使用感到迷惑,本文主要为大家梳理一下异步方法的变迁以及如何使用异步方法. Beg ...
最新文章
- hibernate-session中的方法
- java rectangle 类_Java编写的Rectangle类
- Java 进程占用 VIRT 虚拟内存超高的问题研究
- WordPress更改“固定链接”后 页面404原因及解决方法(Nginx版)
- Android 获取app 地址,获取手机设备信息、app版本信息、ip地址
- 学金融会python_学python对金融有用吗
- C++实现复制文本粘贴文本功能
- mysql建立数据库需要注意什么_创建数据库的语句是什么 MySQL数据库使用教程
- 爬虫日记(71):用OCR来对抗字体反爬
- 云ecs服务器自动重启,云服务器需要定时重启吗?服务器进行重启的原因是什么?...
- 关于web前端性能优化总结
- 用c语言实现打印日历
- 计算机excel表格教程高级筛选6,Excel高级筛选
- RationalDMIS7.1定制报告(Excel模板制作)
- 平衡搜索树中的左单旋右单旋双旋
- lisp语言与python_Lisp 语言优点那么多,为什么国内很少运用?
- 微软WHQL认证的好处
- 2509-Druid监控功能的深入使用与配置-基于SpringBoot-完全使用 .properties配置文件
- 【服务器数据恢复】EMC存储Zfs文件系统下raid5数据恢复案例
- 上千家企业涌入蚂蚁开放联盟链:在区块链上抢先吃红利螃蟹
热门文章
- 【CF-1285E】Delete a Segment(区间处理(并集)----思维)
- linux 脚本监控程序,用shell脚本实现监控程序自动重启
- SLAM--Pangolin显示相机位姿
- cydia无法安装卸载插件_【初识太极】CAD卸载不干净无法重新安装怎么办?
- android kill process,为什么Application有时会在killProcess上重启?
- MCS:连续随机变量——Beta分布
- 成功要素:富兰克林的13条必要美德! 与 狗熊掰棒子
- AWS DeepRacer 默认参数调优 实验一
- 算法:找出存在子字符串的最先位置28. Implement strStr()
- java interface 传值_前后端分离传值方案-RestfulAPI