zoukankan      html  css  js  c++  java
  • 委托 异步

    public static void after(IAsyncResult result)
    {
    AsyncResult async = (AsyncResult)result;
    Func<string, string> func =(Func<string,string>)async.AsyncDelegate;//获取异步调用的委托对象 被传入AsyncCallback委托目标中的IAsyncnResult参数,其实是System.Runtime.Remoting.Messaging命名空间下的AsyncResult类。该类的静态属性AsyncDelegate返回了别处创建的原始异步委托的引用。
    Console.WriteLine(func.EndInvoke(result));
    }
    static void Main(string[] args)
    {
    Func<string, string> func = Untity.Rollover;
    AsyncCallback Callback=new AsyncCallback(Program.after);//异步完成时调用的方法
    func.BeginInvoke(Console.ReadLine(), Callback, null);
    Console.ReadKey();

    }
    
    

    我们可以发现,在Begin()和End()之间的是异步的,但是在End之后的主线程还是被阻塞了(其实是Begin完成之前,End调用线程被阻塞了)。主线程有被阻塞的可能,那么异步委托就毫无优势可言。为了让线程能够发现一部调用是否完成,IAsyncResult接口提供了IsCompleted属性。使用这个成员,调用线程在调用End之前,便能够判断异步调用是否真的完成。没有完成可以做其他事情。

     

    Code
    IAsyncResult iftAR = b.BeginInvoke(10, 10, null, null);

    // 直到Add()方法完成,消息才会显示出来
    while (!iftAR.IsCompleted)
    {
    Console.WriteLine("Doing more work in Main()!");
    // 这里只是为了等待1秒,防止输出太多
    Thread.Sleep(1000);
    }

    // 知道Add已经完成
    int answer = b.EndInvoke(iftAR);

     

    除了IsCompleted属性,接口还提供了AsyncWaitHandle属性以便实现更加灵活的阻塞控制。这个属性返回一个WaitHandle类型的实例,它有一个名为waitOne()的方法。使用这个方法可以指定等待时间。如果超时,waitOne()返回false

    IAsyncResult iftAR = b.BeginInvoke(10, 10, null, null);

    // 直到Add()方法完成,消息才会显示出来
    while (!iftAR.AsyncWaitHandle.WaitOne(1000, true))
    {
    Console.WriteLine("Doing more work in Main()!");
    }

    // 知道Add已经完成
    int answer = b.EndInvoke(iftAR);

    这就像不重不断询问的方式,并不是很高效,委托还提供了另外的技术来获取异步调用结果。

     

     

    AsynCallbackAsyncResult、传递自定义数据

    通过轮询的方式来确定调用的方法执行是否结束,这种方式并不好。我们可以在任务完成的时候由次线程主动通知调用线程的方式。要使用这种方式,需要在BeginInvoke()时提供一个System.AsyncCallback委托的实例作为参数。只要提供了这个对象,当一部调用完成的时候,委托便会自动调用(AsyncCallback对象)指定的方法。



  • 相关阅读:
    BZOJ3578:GTY的人类基因组计划2(集合hash,STL)
    【BZOJ 1022】 [SHOI2008]小约翰的游戏John
    【BZOJ 1295】 [SCOI2009]最长距离
    【BZOJ 1103】 [POI2007]大都市meg
    【BZOJ 3172】 [Tjoi2013]单词
    【BZOJ 1067】 [SCOI2007]降雨量
    【BZOJ 1491】 [NOI2007]社交网络
    【BZOJ 1087】[SCOI2005]互不侵犯King
    【BZOJ 1009】 [HNOI2008]GT考试
    【BZOJ 1053】[HAOI2007]反素数ant
  • 原文地址:https://www.cnblogs.com/smailxiaobai/p/2251012.html
Copyright © 2011-2022 走看看