重新想象 Windows 8 Store Apps (45) - 多线程之异步编程: IAsyncAction, IAsyncOperation, IAsyncActionWithProgress, IAsyncOperationWithProgress
重新想象 Windows 8 Store Apps (45) - 多线程之异步编程: IAsyncAction, IAsyncOperation, IAsyncActionWithProgress, IAsyncOperationWithProgress
作者:webabcd
介绍
重新想象 Windows 8 Store Apps 之 异步编程
- IAsyncAction - 无返回值,无进度值
- IAsyncOperation - 有返回值,无进度值
- IAsyncActionWithProgress - 无返回值,有进度值
- IAsyncOperationWithProgress - 有返回值,有进度值
示例
1、演示 IAsyncAction(无返回值,无进度值)的用法
Thread/Async/IAsyncActionDemo.xaml
<Page x:Class="XamlDemo.Thread.Async.IAsyncActionDemo" 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="btnCreateAsyncAction" Content="执行一个 IAsyncAction" Click="btnCreateAsyncAction_Click_1" Margin="0 10 0 0" /> <Button Name="btnCancelAsyncAction" Content="取消" Click="btnCancelAsyncAction_Click_1" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
Thread/Async/IAsyncActionDemo.xaml.cs
/* * 演示 IAsyncAction(无返回值,无进度值)的用法 * * 注: * 1、WinRT 中的异步功能均源自 IAsyncInfo * 2、IAsyncAction, IAsyncOperation<TResult>, IAsyncActionWithProgress<TProgress>, IAsyncOperationWithProgress<TResult, TProgress> 均继承自 IAsyncInfo * * * 另: * Windows.System.Threading.ThreadPool.RunAsync() - 返回的就是 IAsyncAction */ using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using Windows.Foundation; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace XamlDemo.Thread.Async { public sealed partial class IAsyncActionDemo : Page { private IAsyncAction _action; public IAsyncActionDemo() { this.InitializeComponent(); } private IAsyncAction GetAsyncAction() { // 通过 System.Runtime.InteropServices.WindowsRuntime.AsyncInfo 创建 IAsyncAction return AsyncInfo.Run( (token) => // CancellationToken token Task.Run( () => { token.WaitHandle.WaitOne(3000); token.ThrowIfCancellationRequested(); }, token)); } private void btnCreateAsyncAction_Click_1(object sender, RoutedEventArgs e) { _action = GetAsyncAction(); // 可以 await _action // IAsyncAction 完成后 _action.Completed = (asyncInfo, asyncStatus) => // IAsyncAction asyncInfo, AsyncStatus asyncStatus { // AsyncStatus 包括:Started, Completed, Canceled, Error lblMsg.Text = "完成了,AsyncStatus: " + asyncStatus.ToString(); }; lblMsg.Text = "开始执行,3 秒后完成"; } // 取消 IAsyncAction private void btnCancelAsyncAction_Click_1(object sender, RoutedEventArgs e) { if (_action != null) _action.Cancel(); } } }
2、演示 IAsyncOperation<TResult>(有返回值,无进度值)的用法
Thread/Async/IAsyncOperationDemo.xaml
<Page x:Class="XamlDemo.Thread.Async.IAsyncOperationDemo" 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="btnCreateAsyncOperation" Content="执行一个 IAsyncOperation" Click="btnCreateAsyncOperation_Click_1" Margin="0 10 0 0" /> <Button Name="btnCancelAsyncOperation" Content="取消" Click="btnCancelAsyncOperation_Click_1" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
Thread/Async/IAsyncOperationDemo.xaml.cs
/* * 演示 IAsyncOperation<TResult>(有返回值,无进度值)的用法 * * 注: * 1、WinRT 中的异步功能均源自 IAsyncInfo * 2、IAsyncAction, IAsyncOperation<TResult>, IAsyncActionWithProgress<TProgress>, IAsyncOperationWithProgress<TResult, TProgress> 均继承自 IAsyncInfo */ using System; using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using Windows.Foundation; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace XamlDemo.Thread.Async { public sealed partial class IAsyncOperationDemo : Page { private IAsyncOperation<int> _operation; public IAsyncOperationDemo() { this.InitializeComponent(); } private IAsyncOperation<int> GetAsyncOperation(int x, int y) { // 通过 System.Runtime.InteropServices.WindowsRuntime.AsyncInfo 创建 IAsyncOperation<TResult> return AsyncInfo.Run<int>( (token) => // CancellationToken token Task.Run<int>( () => { token.WaitHandle.WaitOne(3000); token.ThrowIfCancellationRequested(); // 返回结果 return x * y; }, token)); } private void btnCreateAsyncOperation_Click_1(object sender, RoutedEventArgs e) { _operation = GetAsyncOperation(10, 10); // 可以 await _operation // IAsyncOperation<TResult> 完成后 _operation.Completed = (asyncInfo, asyncStatus) => // IAsyncAction asyncInfo, AsyncStatus asyncStatus { // AsyncStatus 包括:Started, Completed, Canceled, Error lblMsg.Text = "完成了,AsyncStatus: " + asyncStatus.ToString(); if (asyncStatus == AsyncStatus.Completed) { lblMsg.Text += Environment.NewLine; // 获取异步操作的返回结果 lblMsg.Text += "结果: " + asyncInfo.GetResults().ToString(); } }; lblMsg.Text = "开始执行,3 秒后完成"; } // 取消 IAsyncOperation<TResult> private void btnCancelAsyncOperation_Click_1(object sender, RoutedEventArgs e) { if (_operation != null) _operation.Cancel(); } } }
3、演示 IAsyncActionWithProgress<TProgress>(无返回值,有进度值)的用法
Thread/Async/IAsyncActionWithProgressDemo.xaml
<Page x:Class="XamlDemo.Thread.Async.IAsyncActionWithProgressDemo" 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" /> <TextBlock Name="lblProgress" FontSize="14.667" /> <Button Name="btnCreateAsyncActionWithProgress" Content="执行一个 IAsyncActionWithProgress" Click="btnCreateAsyncActionWithProgress_Click_1" Margin="0 10 0 0" /> <Button Name="btnCancelAsyncActionWithProgress" Content="取消" Click="btnCancelAsyncActionWithProgress_Click_1" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
Thread/Async/IAsyncActionWithProgressDemo.xaml.cs
/* * 演示 IAsyncActionWithProgress<TProgress>(无返回值,有进度值)的用法 * * 注: * 1、WinRT 中的异步功能均源自 IAsyncInfo * 2、IAsyncAction, IAsyncOperation<TResult>, IAsyncActionWithProgress<TProgress>, IAsyncOperationWithProgress<TResult, TProgress> 均继承自 IAsyncInfo */ using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using Windows.Foundation; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace XamlDemo.Thread.Async { public sealed partial class IAsyncActionWithProgressDemo : Page { private IAsyncActionWithProgress<int> _action; public IAsyncActionWithProgressDemo() { this.InitializeComponent(); } private IAsyncActionWithProgress<int> GetAsyncActionWithProgress() { // 通过 System.Runtime.InteropServices.WindowsRuntime.AsyncInfo 创建 IAsyncActionWithProgress<TProgress> return AsyncInfo.Run<int>( (token, progress) => // CancellationToken token, IProgress<TProgress> progress Task.Run( () => { // 报告进度(进度是一个 int 值) progress.Report(0); int percent = 0; while (percent < 100) { token.WaitHandle.WaitOne(100); token.ThrowIfCancellationRequested(); percent++; // 报告进度(进度是一个 int 值) progress.Report(percent); } }, token)); } private void btnCreateAsyncActionWithProgress_Click_1(object sender, RoutedEventArgs e) { _action = GetAsyncActionWithProgress(); // 可以 await _action // IAsyncActionWithProgress<TProgress> 完成后 _action.Completed = (asyncInfo, asyncStatus) => // IAsyncAction asyncInfo, AsyncStatus asyncStatus { // AsyncStatus 包括:Started, Completed, Canceled, Error lblMsg.Text = "完成了,AsyncStatus: " + asyncStatus.ToString(); }; // IAsyncActionWithProgress<TProgress> 接收到进度后 _action.Progress = (asyncInfo, progressInfo) => // IAsyncActionWithProgress<TProgress> asyncInfo, TProgress progressInfo { // 进度是一个 int 值 lblProgress.Text = "进度: " + progressInfo.ToString(); }; lblMsg.Text = "开始执行"; } // 取消 IAsyncActionWithProgress<TProgress> private void btnCancelAsyncActionWithProgress_Click_1(object sender, RoutedEventArgs e) { if (_action != null) _action.Cancel(); } } }
4、演示 IAsyncOperationWithProgress<TResult, TProgress>(有返回值,有进度值)的用法
Thread/Async/IAsyncOperationWithProgressDemo.xaml
<Page x:Class="XamlDemo.Thread.Async.IAsyncOperationWithProgressDemo" 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" /> <TextBlock Name="lblProgress" FontSize="14.667" /> <Button Name="btnCreateAsyncOperationWithProgress" Content="执行一个 IAsyncOperationWithProgress" Click="btnCreateAsyncOperationWithProgress_Click_1" Margin="0 10 0 0" /> <Button Name="btnCancelAsyncOperationWithProgress" Content="取消" Click="btnCancelAsyncOperationWithProgress_Click_1" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
Thread/Async/IAsyncOperationWithProgressDemo.xaml.cs
/* * 演示 IAsyncOperationWithProgress<TResult, TProgress>(有返回值,有进度值)的用法 * * 注: * 1、WinRT 中的异步功能均源自 IAsyncInfo * 2、IAsyncAction, IAsyncOperation<TResult>, IAsyncActionWithProgress<TProgress>, IAsyncOperationWithProgress<TResult, TProgress> 均继承自 IAsyncInfo * * * 另: * Windows.Web.Syndication.SyndicationClient.RetrieveFeedAsync() - 返回的就是 IAsyncOperationWithProgress<TResult, TProgress> */ using System; using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using Windows.Foundation; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace XamlDemo.Thread.Async { public sealed partial class IAsyncOperationWithProgressDemo : Page { private IAsyncOperationWithProgress<string, int> _operation; public IAsyncOperationWithProgressDemo() { this.InitializeComponent(); } private IAsyncOperationWithProgress<string, int> GetAsyncOperationWithProgress() { // 通过 System.Runtime.InteropServices.WindowsRuntime.AsyncInfo 创建 IAsyncOperationWithProgress<TResult, TProgress> return AsyncInfo.Run<string, int>( (token, progress) => Task.Run<string>( () => { // 报告进度(进度是一个 int 值) progress.Report(0); int percent = 0; while (percent < 100) { token.WaitHandle.WaitOne(100); token.ThrowIfCancellationRequested(); percent++; // 报告进度(进度是一个 int 值) progress.Report(percent); } // 返回结果 return "成功了"; }, token)); } private void btnCreateAsyncOperationWithProgress_Click_1(object sender, RoutedEventArgs e) { _operation = GetAsyncOperationWithProgress(); // 可以 await _operation // IAsyncOperationWithProgress<TResult, TProgress> 完成后 _operation.Completed = (asyncInfo, asyncStatus) => // IAsyncAction asyncInfo, AsyncStatus asyncStatus { // AsyncStatus 包括:Started, Completed, Canceled, Error lblMsg.Text = "完成了,AsyncStatus: " + asyncStatus.ToString(); if (asyncStatus == AsyncStatus.Completed) { lblMsg.Text += Environment.NewLine; // 获取异步操作的返回结果 lblMsg.Text += "结果: " + asyncInfo.GetResults().ToString(); } }; // IAsyncOperationWithProgress<TResult, TProgress> 接收到进度后 _operation.Progress = (asyncInfo, progressInfo) => // IAsyncActionWithProgress<TProgress> asyncInfo, TProgress progressInfo { // 进度是一个 int 值 lblProgress.Text = "进度: " + progressInfo.ToString(); }; lblMsg.Text = "开始执行"; } // 取消 IAsyncOperationWithProgress<TResult, TProgress> private void btnCancelAsyncOperationWithProgress_Click_1(object sender, RoutedEventArgs e) { if (_operation != null) _operation.Cancel(); } } }
OK
[源码下载]