且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Windows Phone 7 异步编程模型

更新时间:2022-10-03 21:38:09

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.         } 

运行的效果

 

Windows Phone 7 异步编程模型 

 


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