Windows 8 Store Apps學習(43) 多線程之任務

來源:互聯網
上載者:User

多線程之任務: Task 基礎, 多任務並存執行, 並行運算(Parallel)

介紹

重新想象 Windows 8 Store Apps 之 任務

Task - 基於線程池的任務(在 System.Threading.Tasks 命名空間下)

多 Task 的並存執行

Parallel - 並行計算(在 System.Threading.Tasks 命名空間下)

樣本

1、示範 Task(基於線程池的任務)的基本應用

Thread/Tasks/TaskDemo.xaml

<Page    x:Class="XamlDemo.Thread.Tasks.TaskDemo"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:local="using:XamlDemo.Thread.Tasks"    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="btnCreateTask" Content="執行一個沒有傳回值的任務" Click="btnCreateTask_Click_1" Margin="0 10 0 0" />            <Button Name="btnCancelTask" Content="取消“執行一個沒有傳回值的任務”" Click="btnCancelTask_Click_1" Margin="0 10 0 0" />                            <Button Name="btnCreateTaskWithReturn" Content="執行一個帶傳回值的任務" Click="btnCreateTaskWithReturn_Click_1" Margin="0 30 0 0" />            <Button Name="btnCancelTaskWithReturn" Content="取消“執行一個帶傳回值的任務”" Click="btnCancelTaskWithReturn_Click_1" Margin="0 10 0 0" />            </StackPanel>    </Grid></Page>

Thread/Tasks/TaskDemo.xaml.cs

/* * Task - 基於線程池的任務(在 System.Threading.Tasks 命名空間下) */    using System;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using System.Threading.Tasks;using System.Threading;using Windows.UI.Core;    namespace XamlDemo.Thread.Tasks{    public sealed partial class TaskDemo : Page    {        /*         * CancellationTokenSource - 用於取消 CancellationToken          *     Token - 一個 CancellationToken 類型的對象,用於關聯 Task         *     IsCancellationRequested - 是否收到了取消操作的請求         *     Cancel() - 發出取消操作的請求         *              * CancellationToken - 用於關聯 Task,以便取消 Task         *     IsCancellationRequested - 是否收到了取消操作的請求         *     WaitHandle - 訊號,可以通過 WaitHandle.WaitOne() 在當前線程等待         *     ThrowIfCancellationRequested() - 如果收到了取消操作的請求,則拋出一個OperationCanceledException 異常         */        private CancellationTokenSource _cts;            public TaskDemo()        {            this.InitializeComponent();        }            private void btnCreateTask_Click_1(object sender, RoutedEventArgs e)        {            _cts = new CancellationTokenSource();                // 執行個體化一個 Task,可隨時通過 task.Status 擷取任務狀態            Task task = new Task(                (ctx) => // 任務所調用的方法,沒有傳回值                {                    // 在當前線程上阻塞 3000 毫秒(當收到取消請求時會發出訊號,停止阻塞)                    _cts.Token.WaitHandle.WaitOne(3000);                        // 收到取消操作的請求後拋出一個 OperationCanceledException 異常,其會導致task.IsCanceled 的值變為 true                    // 此處的代碼等同於 _cts.Token.ThrowIfCancellationRequested();                    if (_cts.IsCancellationRequested)                        throw new OperationCanceledException(_cts.Token);                },                null, // 內容物件,task.AsyncState 可擷取到此對象,上面的 ctx 也可擷取到此對象                _cts.Token // 關聯的 CancellationToken 對象,用於取消操作            );                // 開始執行任務            task.Start();            // task.Wait(); 在當前線程上等待任務執行完            lblMsg.Text = "執行了一個沒有傳回值的任務,3 秒後執行完畢";                // 任務執行完畢後的處理(註:ContinueWith 方法支援任意次回調,即可以寫多個task.ContinueWith() 都會被回調)            task.ContinueWith(                (ctx) => // 任務執行完畢後所調用的方法                {                    if (ctx.IsCanceled) // 任務被取消                    {                        var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,                            () =>                            {                                lblMsg.Text += Environment.NewLine;                                lblMsg.Text += "取消了“執行一個沒有傳回值的任務”";                            });                    }                    if (ctx.IsFaulted) // 任務發生了一個未處理異常                    {                        var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,                            () =>                            {                                lblMsg.Text += Environment.NewLine;                                lblMsg.Text += "“執行一個沒有傳回值的任務”發生了一個未處理異常";                            });                    }                    if (ctx.IsCompleted) // 任務已完成(任務成功地執行完畢或被取消或發生了未處理異常都會 ctx.IsCompleted == true)                    {                        var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,                            () =>                            {                                lblMsg.Text += Environment.NewLine;                                lblMsg.Text += "“執行一個沒有傳回值的任務”執行完成,taskId: " + ctx.Id.ToString();                            });                    }                });        }            private void btnCancelTask_Click_1(object sender, RoutedEventArgs e)        {            // 發出取消操作的請求            _cts.Cancel();            // _cts.CancelAfter(1000); // 1000 毫秒後發出取消操作的請求        }                    private void btnCreateTaskWithReturn_Click_1(object sender, RoutedEventArgs e)        {            _cts = new CancellationTokenSource();                Func<object, string> handler = delegate(object state) // state 是傳遞過來的內容物件            {                // 在當前線程上阻塞 3000 毫秒(當收到取消請求時會發出訊號,停止阻塞)                _cts.Token.WaitHandle.WaitOne(3000);                    // 收到取消操作的請求後拋出一個 OperationCanceledException 異常,其會導致task.IsCanceled 的值變為 true                // 此處的代碼等同於 _cts.Token.ThrowIfCancellationRequested();                if (_cts.IsCancellationRequested)                    throw new OperationCanceledException(_cts.Token);                    return "我是“執行一個帶傳回值的任務”的傳回值";            };                // Task.Factory.StartNew() - 建立任務並馬上執行,可隨時通過 task.Status 擷取任務狀態            // Task.Run() 同樣是建立任務並馬上執行            Task<string> task = Task.Factory.StartNew<string>(                handler, // 任務所調用的方法,帶傳回值                null, // 內容物件,task.AsyncState 可擷取到此對象                _cts.Token // 關聯的 CancellationToken 對象,用於取消操作            );            lblMsg.Text = "執行了一個帶傳回值的任務,3 秒後執行完畢";                // 任務執行完畢後的處理(註:ContinueWith 方法支援任意次回調,即可以寫多個task.ContinueWith() 都會被回調)            task.ContinueWith(                (ctx) =>                {                    if (ctx.IsCanceled) // 任務被取消                    {                        var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,                            () =>                            {                                lblMsg.Text += Environment.NewLine;                                lblMsg.Text += "取消了“執行一個帶傳回值的任務”";                            });                    }                    if (ctx.IsFaulted) // 任務發生了一個未處理異常                    {                        var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,                            () =>                            {                                lblMsg.Text += Environment.NewLine;                                lblMsg.Text += "“執行一個帶傳回值的任務”發生了一個未處理異常";                            });                    }                    if (ctx.IsCompleted) // 任務已完成(任務成功地執行完畢或被取消或發生了未處理異常都會 ctx.IsCompleted == true)                    {                        var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,                            () =>                            {                                lblMsg.Text += Environment.NewLine;                                lblMsg.Text += "“執行一個帶傳回值的任務”執行完成,taskId: " + ctx.Id.ToString();                            });                            // 當任務成功地執行完畢時,輸出任務的傳回值                        if (!ctx.IsCanceled && !ctx.IsFaulted)                        {                            ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,                            () =>                            {                                lblMsg.Text += Environment.NewLine;                                // 任務的傳回值                                lblMsg.Text += ctx.Result;                            });                        }                    }                });        }            private void btnCancelTaskWithReturn_Click_1(object sender, RoutedEventArgs e)        {            // 發出取消操作的請求            _cts.Cancel();            // _cts.CancelAfter(1000); // 1000 毫秒後發出取消操作的請求        }    }}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.