zoukankan      html  css  js  c++  java
  • 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();
            }
  • 相关阅读:
    Ubuntu18.04+CUDA+CUDNN+Pytorch环境配置
    VIM入门必读(转)
    简述C和C++的学习历程(转)
    队列
    排序实现
    十进制转二进制
    北邮1467二叉树题引起的思考
    计算机是如何启动的?
    c语言字符串操作实现
    北邮机试——huffman权值问题
  • 原文地址:https://www.cnblogs.com/NicolasLiaoran/p/12963427.html
Copyright © 2011-2022 走看看