重新想象 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();
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();
token.ThrowIfCancellationRequested(); // 返回结果
return x * y;
},
token));
} private void btnCreateAsyncOperation_Click_1(object sender, RoutedEventArgs e)
{
_operation = GetAsyncOperation(, ); // 可以 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(); int percent = ;
while (percent < )
{
token.WaitHandle.WaitOne();
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(); int percent = ;
while (percent < )
{
token.WaitHandle.WaitOne();
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
[源码下载]
重新想象 Windows 8 Store Apps (45) - 多线程之异步编程: IAsyncAction, IAsyncOperation, IAsyncActionWithProgress, IAsyncOperationWithProgress的更多相关文章
- 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换
[源码下载] 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换 作者:webabcd 介绍 ...
- 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法
[源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...
- 重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)
[源码下载] 重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel) 作者:webabcd 介绍重新想象 W ...
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
[源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...
- 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent
[源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...
- 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationContext, CoreDispatcher, ThreadLocal, ThreadStaticAttribute
[源码下载] 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationCont ...
- 重新想象 Windows 8 Store Apps 系列文章索引
[源码下载][重新想象 Windows 8.1 Store Apps 系列文章] 重新想象 Windows 8 Store Apps 系列文章索引 作者:webabcd 1.重新想象 Windows ...
- 重新想象 Windows 8 Store Apps (34) - 通知: Toast Demo, Tile Demo, Badge Demo
[源码下载] 重新想象 Windows 8 Store Apps (34) - 通知: Toast Demo, Tile Demo, Badge Demo 作者:webabcd 介绍重新想象 Wind ...
- 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解
[源码下载] 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通知 Toa ...
随机推荐
- [转载]BW增量更新的理解(时间戳)
在BW中,存在两种数据抽取方式,完全更新与增量更新,完全更新是每次把截至到某个时间的数据全部抽取,增量抽取则只抽取上次和本次抽取之间更新的数据,很显然,增量抽取能够提高系统效率,根据SAP帮 助的说法 ...
- 【cocos2d-x 手游研发----目录】
感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...
- Xcode报错:“Your build settings specify a provisioning profile with the UUID..... however, no such provisioning profile was found”
运行环境: Xcode5 & 5.0及以上版本 对工程进行Archive打包的时候出现如下错误 问题描述: Code Sign error: No matching provisionin ...
- sizeof()用法汇总
sizeof()功能:计算数据空间的字节数 1.与strlen()比较 strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素. ...
- sublime返回上一编辑位置
用了sublime好长时间了,最近发现一个python插件可以在编辑的时候返回上一编辑位置,这个功能在eclipse很常用,现在终于能在sublime上使用了.好爽. 贴个地址:https://for ...
- 译:C#面向对象的基本概念 (Basic C# OOP Concept) 第二部分(封装,抽象,继承)
6.封装 封装就是对外部类隐藏成员或变量.我已经说过房子的保安仅仅被限制在房子的入口处,不需要知道屋内发生了什么.房主对保安隐藏了屋内所发生的任何事,以便更安全.隐藏和限制就被称为封装. 例如我们有两 ...
- 使用UIKit制作卡牌游戏(二)ios游戏篇
转自朋友Tommy 的翻译,自己只翻译了第三篇教程. 译者: Tommy | 原文作者: Matthijs Hollemans写于2012/07/06 原文地址: http://www.raywend ...
- 写给已有编程经验的 Python 初学者的总结
当我开始学习Python的时候,有些事我希望我一早就知道.我花费了很多时间才学会这些东西.我想要把这些重点都编纂到一篇文章当中.这篇文章的目标读者,是刚刚开始学习Python语言的有经验的程序员,想要 ...
- STM32 flash 内存分布介绍
摘要: 本文以STM32F103RBT6为例介绍了片上Flash(Embedded Flash)若干问题,包括Flash大小(内存映射).块大小.页面大小.寄存器.这些知识,有利于写Flash驱动. ...
- rsync安装配置及故障解决完全教程[window, 文件同步]
Rsync是的全称是: remote synchronize, 也就是远程同步数据, 它是一款不错的文件同步软件,而且是免费的, 它在镜像保存整个目录树和文件系统的同时保持原来文件的权限.时间.软硬链 ...