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 异步编程模型相关推荐

  1. [你必须知道的异步编程]——异步编程模型(APM)

    本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中介绍了从C#1.0--C#4.0中一些 ...

  2. 【转】1.6异步编程:IAsyncResult异步编程模型 (APM)

    传送门:异步编程系列目录-- 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作.然而,这个技术存在许多限制.最大的问 ...

  3. C#异步编程-------异步编程模型(APM)

    术语解释: APM               异步编程模型, Asynchronous Programming Model EAP                基于事件的异步编程模式, Event ...

  4. 异步编程模型(C#5.0系列)

    关于C#5.0的新功能--async和await关键字.它们是语法糖,可以简化异步操作代码的构造.当C#编译器看到一个await表达式时,它会生成代码,该代码自动异步地调用该表达式,然后立即将控制流返 ...

  5. 《CLR Via C# 第3版》笔记之(二十一) - 异步编程模型(APM)

    APM是.NET中异步编程模型的缩写(Asynchronous Programing Model). 通过异步编程,使得我们的程序可以更加高效的利用系统资源. 主要内容: 一个APM的例子 GUI中的 ...

  6. 异步编程模型--使用 IAsyncResult 对象

    先推荐阅读下面的资料: MSDN:异步编程设计模式 IBM developerworks: 使用异步 I/O 大大提高应用程序的性能 参考博文: 1.正确使用异步操作 2.Lab:体会ASP.NET异 ...

  7. c# 三种异步编程模型EAP(*)、 APM(*)和 TPL

    为什么80%的码农都做不了架构师?>>>    EAP 是 Event-based Asynchronous Pattern(基于事件的异步模型)的简写 优点是简单,缺点是当实现复杂 ...

  8. 简单地使用线程之一:使用异步编程模型

    .NetFramework的异步编程模型从本质上来说是使用线程池来完成异步的任务,异步委托.HttpWebRequest等都使用了异步模型. 这里我们使用异步委托来说明异步编程模型. 首先,我们来明确 ...

  9. 并行开发 —— 第六篇 异步编程模型

    在.net里面异步编程模型由来已久,相信大家也知道Begin/End异步模式和事件异步模式,在task出现以后,这些东西都可以被task包装 起来,可能有人会问,这样做有什么好处,下面一一道来. 一: ...

  10. 【转】谈谈c#中异步编程模型的变迁**

    大家在编程过程中都会用到一些异步编程的情况.在c#的BCL中,很多api都提供了异步方法,初学者可能对各种不同异步方法的使用感到迷惑,本文主要为大家梳理一下异步方法的变迁以及如何使用异步方法. Beg ...

最新文章

  1. hibernate-session中的方法
  2. java rectangle 类_Java编写的Rectangle类
  3. Java 进程占用 VIRT 虚拟内存超高的问题研究
  4. WordPress更改“固定链接”后 页面404原因及解决方法(Nginx版)
  5. Android 获取app 地址,获取手机设备信息、app版本信息、ip地址
  6. 学金融会python_学python对金融有用吗
  7. C++实现复制文本粘贴文本功能
  8. mysql建立数据库需要注意什么_创建数据库的语句是什么 MySQL数据库使用教程
  9. 爬虫日记(71):用OCR来对抗字体反爬
  10. 云ecs服务器自动重启,云服务器需要定时重启吗?服务器进行重启的原因是什么?...
  11. 关于web前端性能优化总结
  12. 用c语言实现打印日历
  13. 计算机excel表格教程高级筛选6,Excel高级筛选
  14. RationalDMIS7.1定制报告(Excel模板制作)
  15. 平衡搜索树中的左单旋右单旋双旋
  16. lisp语言与python_Lisp 语言优点那么多,为什么国内很少运用?
  17. 微软WHQL认证的好处
  18. 2509-Druid监控功能的深入使用与配置-基于SpringBoot-完全使用 .properties配置文件
  19. 【服务器数据恢复】EMC存储Zfs文件系统下raid5数据恢复案例
  20. 上千家企业涌入蚂蚁开放联盟链:在区块链上抢先吃红利螃蟹

热门文章

  1. 【CF-1285E】Delete a Segment(区间处理(并集)----思维)
  2. linux 脚本监控程序,用shell脚本实现监控程序自动重启
  3. SLAM--Pangolin显示相机位姿
  4. cydia无法安装卸载插件_【初识太极】CAD卸载不干净无法重新安装怎么办?
  5. android kill process,为什么Application有时会在killProcess上重启?
  6. MCS:连续随机变量——Beta分布
  7. 成功要素:富兰克林的13条必要美德! 与 狗熊掰棒子
  8. AWS DeepRacer 默认参数调优 实验一
  9. 算法:找出存在子字符串的最先位置28. Implement strStr()
  10. java interface 传值_前后端分离传值方案-RestfulAPI