C#5.0 以Task方式实现APM

基于事件的异步模式 (Event-based Asynchronous Pattern, EAP)
异步编程模型 (Asynchronous Programming Model, APM)

基于任务的异步模式 (Task-based Asynchronous Pattern, TAP)

换个方式也就是说,将TAP实现原来Thread中的AutoResetEvent、ManualResetEvent等功能

以下代码来自《Multithreading in C# 5.0 Cookbook》

using System;
using System.Threading;
using System.Threading.Tasks;

namespace APMDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int threadId;
            AsynchronousTask d = Test;
            IncompatibleAsynchronousTask e = Test;

            Console.WriteLine("operation 1");
            Task<string> task = Task<string>.Factory.FromAsync(
                d.BeginInvoke("AsyncTaskThread", Callback, "a delegate asynchronous call"), d.EndInvoke);

            task.ContinueWith(t => Console.WriteLine("callback is finished, now running a continuation! result: {0}", 
                t.Result));

            while(!task.IsCompleted)
            {
                Console.WriteLine(task.Status);
                Thread.Sleep(TimeSpan.FromSeconds(0.5));
            }
            Console.WriteLine(task.Status);
            Thread.Sleep(TimeSpan.FromSeconds(1));

            Console.WriteLine("--------------------------------");
            Console.WriteLine();
            Console.WriteLine("option 2");

            task = Task<string>.Factory.FromAsync(
                d.BeginInvoke, d.EndInvoke, "AsyncTaskThread",
                "a delegate asynchronous call");
            task.ContinueWith(t => Console.WriteLine("task is completed, now running a continuation! result: {0}",
                t.Result));
            Console.WriteLine(task.Status);
            Thread.Sleep(TimeSpan.FromSeconds(1));

            Console.WriteLine("--------------------------------");
            Console.WriteLine();
            Console.WriteLine("option 3");

            IAsyncResult ar = e.BeginInvoke(out threadId, Callback, "a delegate asynchronous call");
            ar = e.BeginInvoke(out threadId, Callback, "a delegate asynchronous call");

            task = Task<string>.Factory.FromAsync(ar, _ => e.EndInvoke(out threadId, ar));
            task.ContinueWith(t =>
            Console.WriteLine("task is completed, now running a continuation! result: {0}, threadid: {1}",
            t.Result, threadId));

            while(!task.IsCompleted)
            {
                Console.WriteLine(task.Status);
                Thread.Sleep(TimeSpan.FromSeconds(0.5));
            }

            Console.WriteLine(task.Status);

            Thread.Sleep(TimeSpan.FromSeconds(1));

            Console.ReadKey();
        }

        private delegate string AsynchronousTask(string threadName);
        private delegate string IncompatibleAsynchronousTask(out int threadId);

        private static void Callback(IAsyncResult ar)
        {
            Console.WriteLine("Starting a callback...");
            Console.WriteLine("State passed to a callback: {0}",
            ar.AsyncState);
            Console.WriteLine("Is thread pool thread: {0}",
            Thread.CurrentThread.IsThreadPoolThread);
            Console.WriteLine("Thread pool worker thread id: {0}",
            Thread.CurrentThread.ManagedThreadId);
        }
        private static string Test(string threadName)
        {
            Console.WriteLine("Starting...");
            Console.WriteLine("Is thread pool thread: {0}",
            Thread.CurrentThread.IsThreadPoolThread);
            Thread.Sleep(TimeSpan.FromSeconds(2));
            Thread.CurrentThread.Name = threadName;
            return string.Format("Thread name: {0}",
            Thread.CurrentThread.Name);
        }

        private static string Test(out int threadId)
        {
            Console.WriteLine("Starting...");
            Console.WriteLine("Is thread pool thread: {0}",
            Thread.CurrentThread.IsThreadPoolThread);
            Thread.Sleep(TimeSpan.FromSeconds(2));
            threadId = Thread.CurrentThread.ManagedThreadId;
            return string.Format("Thread pool worker thread id was:{0}", threadId);
        }
    }
}


你可能感兴趣的:(C#5.0 以Task方式实现APM)