程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Windows 8 Store Apps學習(45) 多線程之異步編程: IAsyncAction

Windows 8 Store Apps學習(45) 多線程之異步編程: IAsyncAction

編輯:關於.NET

多線程之異步編程: IAsyncAction, IAsyncOperation

重新想象 Windows 8 Store Apps (45) - 多線程之異步編程: IAsyncAction, IAsyncOperation, IAsyncActionWithProgress, IAsyncOperationWithProgress

介紹

重新想象 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

[源碼下載]:http://files.cnblogs.com/webabcd/Windows8.rar

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved