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();
            }
  • 相关阅读:
    Mysql(三) Mysq慢查询日志
    Mysql(二) Mysql错误日志
    Mysql(一) Mysql二进制日志
    HA(二)Heartbeat实现LVS集群DR模式下Director高可用
    HA(一)高可用集群原理
    LVS(五)LVS集群RealServer高可用健康监测
    LVS(四)LVS集群DR模式
    LVS(三)LVS集群NAT模式
    LVS(二)LVS集群中实现的三种负载均衡技术
    Cocos2d-JS实现的打飞机
  • 原文地址:https://www.cnblogs.com/NicolasLiaoran/p/12963427.html
Copyright © 2011-2022 走看看