===========================投票案例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication3
{
    class Program
    {
        private delegate int dgTakesAWhile(int date, int ms);
        private delegate void aaa();
        static void Main(string[] args)
        {
            dgTakesAWhile dg = TakesAWhile;
            //异步执行委托
            IAsyncResult sr = dg.BeginInvoke(10, 100, null, null);
            //如果该异步委托没有执行完成,则一直执行循环
            while (!sr.IsCompleted)
            {
                Console.Write(".");
            }
            Console.WriteLine();
            //方法执行结束,返回一个值
            int result = dg.EndInvoke(sr);
            Console.WriteLine(result);
            Console.ReadLine();

        }
        //委托方法
        private static int TakesAWhile(int date, int ms)
        {
            Console.Write("入口");
            Thread.Sleep(ms);
            Console.Write("出口");
            return ++date;
        }
 
    }
}

wKiom1TA_5rhVOpeAALXqy0rJQY293.jpg

===========================等待句柄:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication1
{
    class Program
    {
        private delegate int DGTakesAWhile(int data, int ms);
        static void Main(string[] args)
        {
            DGTakesAWhile dg = TakesAWhile;
            //异步执行委托
            IAsyncResult sr= dg.BeginInvoke(10, 100, null, null);
            while (true)
            {
                Console.WriteLine(".");
                //阻止当前线程(60毫秒),直到异步委托执行完成
                if (sr.AsyncWaitHandle.WaitOne(60,false))
                {
                    Console.WriteLine("收到信号");
                    break;
                }
            }
            //委托结束,返回值
            Console.WriteLine(dg.EndInvoke(sr));
            Console.ReadLine();

        }
        //需要委托的方法
        private static int TakesAWhile(int data, int ms)
        {
            Console.WriteLine("开始");
            Thread.Sleep(ms);
            Console.WriteLine("结束");
            return ++data;
        }
    }
}

wKiom1TA_7WxQKiJAABM0syOWZA211.jpg

 

===========================异步回调

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication2
{
    class Program
    {
        private delegate int DGTakesAWhile(int data, int ms);
        static void Main(string[] args)
        {
            DGTakesAWhile dg = TakesAWhile;
            //异步执行TakesAWhile委托,并执行完委托之后回调CallbackTakesAWhile函数。
            //dg:传递给回调函数的对象
            IAsyncResult ar = dg.BeginInvoke(10, 100, CallbackTakesAWhile, dg);
            
            Console.ReadLine();
            
            
        }
        //委托
        private static int TakesAWhile(int data, int ms)
        {
            Console.WriteLine("进口");
            Thread.Sleep(ms);
            Console.WriteLine("出口");
            return ++data;
        }
        //回调函数
        private static void CallbackTakesAWhile(IAsyncResult ar)
        {
            //获取传递过来的对象
            DGTakesAWhile dg = ar.AsyncState as DGTakesAWhile;
            //委托执行结束,返回值
            Console.WriteLine(dg.EndInvoke(ar));
        }
 
 
    }
}