Windows 8 Store Apps学习(44) 多线程之异步编程2013-12-10 webabcd 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换介绍重新想象 Windows 8 Store Apps 之 异步编程经典的异步编程模型(IAsyncResult)最新的异步编程模型(async 和 await)将 IAsyncInfo 转换成 Task将 Task 转换成 IAsyncInfo示例1、使用经典的异步编程模型(IAsyncResult)实现一个支持异步操作的类Thread/Async/ClassicAsync.cs
/* * 使用经典的异步编程模型(IAsyncResult)实现一个支持异步操作的类 */using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace XamlDemo.Thread.Async{public class ClassicAsync{private delegate string HelloDelegate(string name);private HelloDelegate _helloDelegate;public ClassicAsync(){_helloDelegate = new HelloDelegate(Hello);}private string Hello(string name){new ManualResetEvent(false).WaitOne(3000);return "hello: " + name;}// begin 方法public IAsyncResult BeginRun(string name, AsyncCallback callback, Object state){// 新开线程,去执行 Hello() 方法,callback 是回调,state 是上下文return _helloDelegate.BeginInvoke(name, callback, state);}// end 方法public string EndRun(IAsyncResult ar){if (ar == null)throw new NullReferenceException("IAsyncResult 不能为 null");return _helloDelegate.EndInvoke(ar);}}}
Thread/Async/ClassicAsyncDemo.xaml
<Pagex:Class="XamlDemo.Thread.Async.ClassicAsyncDemo"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:XamlDemo.Thread.Async"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"><Grid Background="Transparent"><StackPanel Margin="120 0 0 0"><TextBlock Name="lblMsg" FontSize="14.667" /><Button Name="btnIAsyncResult" Content="IAsyncResult 的 Demo" Click="btnIAsyncResult_Click_1" Margin="0 10 0 0" /></StackPanel></Grid></Page>
Thread/Async/ClassicAsyncDemo.xaml.cs
/* * 演示如何通过经典的异步编程模型(IAsyncResult)来进行异步操作 ** IAsyncResult - 异步操作结果 * AsyncState - 上下文 * IsCompleted - 异步操作是否已完成 * AsyncWaitHandle -获取用于等待异步操作完成的 System.Threading.WaitHandle 对象(通过WaitHandle.WaitOne() 在当前线程等待) */using System;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;namespace XamlDemo.Thread.Async{public sealed partial class ClassicAsyncDemo : Page{System.Threading.SynchronizationContext _syncContext;public ClassicAsyncDemo(){this.InitializeComponent();// 获取当前 UI 线程_syncContext = System.Threading.SynchronizationContext.Current;}private void btnIAsyncResult_Click_1(object sender, RoutedEventArgs e){ClassicAsync classicAsync = new ClassicAsync();IAsyncResult ar = classicAsync.BeginRun("webabcd", new AsyncCallback(Callback), classicAsync);lblMsg.Text = "开始执行,3 秒后完成";}private void Callback(IAsyncResult ar){ClassicAsync classicAsync = (ClassicAsync)ar.AsyncState;string result = classicAsync.EndRun(ar);_syncContext.Post((ctx) =>{lblMsg.Text = result;},null);}}}