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

 


 
 
  1. Windows Phone 7上的异步编程模型其实也就是说把C#里面的异步编程模型在Windows Phone 7应用开发上使用。下面来看一下异步编程模型里面的一些关键的概念。  
  2.    
  3. 2个方法和一个委托和一个接口:  
  4. (1)BeginInvoke方法用于启动异步调用  
  5. Begin 方法包含同步方法签名中的任何参数,此外还包含另外两个参数:一个AsyncCallback 委托和一个用户定义的状态对象。委托用来调用回调方法,状态对象是用来向回调方法传递状态信息。  
  6. BeginInvoke立即返回,不等待异步调用完成。  
  7. BeginInvoke返回IasyncResult,可用于监视调用进度。  
  8.    
  9.  
  10. (2)EndInvoke方法用于检索异步调用结果。  
  11. End 方法用于结束异步操作并返回结果,因此包含同步方法签名中的 ref 和 out 参数,返回值类型也与同步方法相同。该方法还包括一个 IAsyncResult 参数,用于获取异步操作是否完成的信息,当然在使用时就必须传入对应的 Begin 方法返回的对象实例开始异步操作后如果要阻止应用程序,可以直接调用 End 方法,这会阻止应用程序直到异步操作完成后再继续执行。也可以使用 IAsyncResult 的 AsyncWaitHandle 属性,调用其中的WaitOne等方法来阻塞线程。这两种方法的区别不大,只是前者必须一直等待而后者可以设置等待超时。  
  12.    
  13. 如果不阻止应用程序,则可以通过轮循 IAsyncResult 的 IsCompleted 状态来判断操作是否完成,或使用 AsyncCallback 委托来结束异步操作。AsyncCallback 委托包含一个 IAsyncResult 的签名,回调方法内部再调用 End 方法来获取操作执行结果。  
  14.    
  15. 在调用BeginInvoke后可随时调用EndInvoke方法,注意:始终在异步调用完成后调用EndInvoke.如果异步调用未完成,EndInvoke将一直阻塞到异步调用完成。  
  16. EndInvoke的参数包括需要异步执行的方法的out和ref参数以及由BeginInvoke返回的IAsyncResult。要注意的是,始终在异步调用完成后调用EndInvoke  
  17.    
  18. (3)AsyncCallback委托用于指定在开始操作完成后应被调用的方法  
  19. AsyncCallback委托被作为开始操作上的第二个到最后一个参数传递  
  20. 代码原型如下:  
  21. [Serializable]  
  22. public delegate void AsyncCallback(IAsyncResult ar);  
  23.    
  24. (4)IAsyncResult接口  
  25. 它表示异步操作的状态.  
  26. 该接口定义了4个公用属性  
  27. public interface IAsyncResult   
  28.  {    
  29. object AsyncState { get; }   
  30.  WaitHandle AsyncWaitHandle { get; }  
  31.   bool CompletedSynchronously { get; }   
  32.  bool IsCompleted { get; }   
  33.  }   
  34.  
  35.    
  36.    
  37. 在Windows Phone 7上的应用  
  38.    
  39. AsyncResultNoResult.cs  

AsyncResult.cs

 


 
 
  1. using System;  
  2.  
  3. namespace AsyncTaskDemo  
  4. {  
  5.     public class AsyncResult<TResult> : AsyncResultNoResult  
  6.     {  
  7.         private TResult m_result;//异步操作完成返回的对象  
  8.  
  9.         public AsyncResult(AsyncCallback asyncCallback, object state)  
  10.             : base(asyncCallback, state)  
  11.         {  
  12.             this.m_result = default(TResult);  
  13.         }  
  14.         /// <summary> 
  15.         /// 停止异步返回返回对象  
  16.         /// </summary> 
  17.         /// <returns></returns> 
  18.         public TResult EndInvoke()  
  19.         {  
  20.             base.EndInvoke(); //等待操作完成   
  21.             return m_result;  // 返回结果  
  22.         }  
  23.         /// <summary> 
  24.         /// 操作完成  
  25.         /// </summary> 
  26.         /// <param name="result">返回结果对象</param> 
  27.         /// <param name="completedSynchronously">是否同步操作</param> 
  28.         public void SetAsCompleted(TResult result, bool completedSynchronously)  
  29.         {  
  30.             //保存异步操作的结果  
  31.             m_result = result;  
  32.             base.SetAsCompleted(null, completedSynchronously);  
  33.         }  
  34.     }  

TestTask.cs

 


 
 
  1. using System;  
  2. using System.Threading;  
  3.  
  4. namespace AsyncTaskDemo  
  5. {  
  6.     public class TestTask  
  7.     {  
  8.         public TestTask()  
  9.         {  
  10.         }  
  11.  
  12.         public IAsyncResult BeginTestTask(string text, AsyncCallback asyncCallback, object state)  
  13.         {  
  14.             AsyncResult<string> asyncResult = new AsyncResult<string>(asyncCallback, state);  
  15.             ThreadPool.QueueUserWorkItem(DoTestTask, asyncResult);  
  16.             return asyncResult;  
  17.         }  
  18.  
  19.         public string EndTestTask(IAsyncResult asyncResult)  
  20.         {  
  21.             return ((AsyncResult<string>)asyncResult).EndInvoke();  
  22.         }  
  23.  
  24.         private void DoTestTask(Object asyncResult)  
  25.         {  
  26.             AsyncResult<string> ar = (AsyncResult<string>)asyncResult;  
  27.             try  
  28.             {  
  29.                 Thread.Sleep(3000);  
  30.                 ar.SetAsCompleted("测试完成", true);  
  31.             }  
  32.             catch (Exception e)  
  33.             {  
  34.                 ar.SetAsCompleted(e, false);  
  35.             }  
  36.         }  
  37.     }  

MainPage.xaml.cs

 


 
 
  1. TestTask tt = new TestTask();  
  2.         WebTask webTask = new WebTask(new Uri("http://www.cnblogs.com/linzheng"));  
  3.         IAsyncResult ia;  
  4.         public MainPage()  
  5.         {  
  6.             InitializeComponent();  
  7.         }  
  8.  
  9.         private void button1_Click(object sender, RoutedEventArgs e)  
  10.         {  
  11.               
  12.             Func<string, IObservable<string>> testResult = Observable.FromAsyncPattern<string, string>(tt.BeginTestTask, tt.EndTestTask);  
  13.  
  14.             ObservableExtensions.Subscribe<string>(  
  15.                Observable.ObserveOnDispatcher<string> 
  16.                (  
  17.                testResult.Invoke("")  
  18.              ),  
  19.               delegate(string success)  
  20.               {  
  21.                   MessageBox.Show(success);  
  22.               },  
  23.               delegate(Exception exception)  
  24.               {  
  25.                   MessageBox.Show(exception.Message);  
  26.               }  
  27.               );  
  28.         } 

运行的效果

 

 

 


本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1078343

相关文章
|
消息中间件 C++ Windows
02 MFC - Windows 编程模型
02 MFC - Windows 编程模型
85 0
|
9月前
|
TensorFlow 网络安全 算法框架/工具
tensorflow的模型使用flask制作windows系统服务
tensorflow的模型使用flask制作windows系统服务
|
安全 网络协议 网络安全
[笔记]windows网络编程之常见模型(下)
[笔记]windows网络编程之常见模型(下)
|
消息中间件 Unix Windows
[笔记]windows网络编程之常见模型(上)
[笔记]windows网络编程之常见模型
177 0
|
Linux Windows Python
记一次windows环境下PaddleNLP的模型下载bug排除
记一次windows环境下PaddleNLP的模型下载bug排除
320 0
记一次windows环境下PaddleNLP的模型下载bug排除
|
消息中间件 安全 网络协议
|
Android开发 iOS开发 Windows
Windows Phone 寿终正寝了,这些经典机型你还记得吗?
不久前,随着最后一家WP手机厂商惠普宣布取消今后Windows Phone的研发计划,以及微软官方声明对WP8.1系统今后所有升级维护的终止,WP手机,作为曾经和安卓手机、苹果手机并驾齐驱的三大智能手机之一,正式寿终正寝。
1592 0
Windows Phone 寿终正寝了,这些经典机型你还记得吗?
|
XML 开发框架 前端开发
Windows Phone快速入门需掌握哪些能力
在此之前,先普及下Windows Phone的概念和开发工具的介绍。 Windows Phone是微软公司开发的手机操作系统,它将微软旗下的Xbox Live游戏、Xbox Music音乐与独特的视频体验集成至手机中。2012年6月21日,微软正式发布Windows Phone 8,采用和Windows 8相同的Windows NT内核,同时也针对市场的Windows Phone 7.5发布Windows Phone 7.8。
191 0
Windows Phone快速入门需掌握哪些能力
|
移动开发 Android开发 开发者
Windows Phone 8.1 新功能汇总 开发者预览版开放下载
在Build 2014大会上,微软正式发布了传闻已久的Windows Phone 8.1系统,所有的Windows Phone 8手机都可以升级,微软这次可谓是十分厚道。虽然并非迭代升级,但WP 8.1还是拥有很多重大更新,对于微软进一步完善移动平台拥有积极的意义。下面,就一起来了解一下WP 8.1的主要新特性。
283 0
Windows Phone 8.1 新功能汇总 开发者预览版开放下载
|
编解码 前端开发 JavaScript
Windows Phone 下开发 LBS 应用
基于位置的服务(Location Based Service,LBS),它是通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标,或大地坐标),在GIS(Geographic Information System,地理信息系统)平台的支持下,为用户提供相应服务的一种增值业务。
224 0