zoukankan      html  css  js  c++  java
  • 重新想象 Windows 8 Store Apps (45)

    [源码下载]


    重新想象 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
    [源码下载]

  • 相关阅读:
    全局变量 static变量
    【Qt学习笔记】04_单选复选框
    【Qt学习笔记】03_特殊标签
    【Qt学习笔记】02_颜色对话框
    【Qt学习笔记】01_模态和非模态
    ThinkPad_E570 拆机
    VMware 共享文件夹
    【安装Flutter遇到的问题】 Android license status unknown
    VLC 外挂字幕乱码
    IE(IE6/IE7/IE8)支持HTML5标签--20150216
  • 原文地址:https://www.cnblogs.com/webabcd/p/3213590.html
Copyright © 2011-2022 走看看