C#中的异步多线程12 轮询

在轮询模式中,原始线程发起了异步方法的调用,做一些其他处理,然后使用IAsyncResult对象的IsComplete属性来定期检查开启的线程是否完成。如果异步方法已经完成,原始线程就调用EndInvoke并继续。否则,做一些其他处理,然后过一会儿再检查。

BeginInvoke返回一个IAsyncResult接口的引用(其内部是AsyncResult类的对象),AsyncResult类表现了异步方法的状态,其特性包括:

1、当调用委托对象的BeginInvoke方法时,系统创建了一个AsyncResult对象,但它不返回对象的引用,而是返回对象中包含的IAsyncResult接口的引用。

2、AsyncResult对象包含一个叫做AsyncDelegate的属性,它返回一个指向被调用来开启异步方法的委托的引用。但是,这个属性是类对象的一部分而不是接口的一部分。

3、IsCompleted属性返回一个bool值,标识异步方法是否完成。

4、AsyncState属性返回一个对象的引用,作为BeginInvoke方法调用时的state参数。它返回object类型的引用。

示例:

        delegate long Mydel(int first, int seconde);
        static long Sum(int x,int y)
        {
            Console.WriteLine("Inside Sum");
            Thread.Sleep(100);
            return x + y;
        }
        static void Main(string[] args)
        {
            Mydel del = new Mydel(Sum);
            //发起并调用异步方法
            IAsyncResult iar = del.BeginInvoke(3, 5, null, null);
            Console.WriteLine("After BeginInvoke");
            //检查异步方法是否完成
            while(!iar.IsCompleted)
            {
                Console.WriteLine("Not Done");
                //继续处理
                for (long i = 0; i < 1000000; i++) ;
            }
            Console.WriteLine("Done");
            //调用EndInvoke来获取接口并进行清理
            long result = del.EndInvoke(iar);
            Console.WriteLine("Result:{0}", result);
            Console.ReadLine();
        }