zoukankan      html  css  js  c++  java
  • 利用委托实现异步调用

    1. 同步调用示例(委托是一个类型安全的,面向对象的指针)
      using System;
      using System.Threading;
      
      namespace Demo
      {
          public delegate int Operate(int x, int y);
      
          public class DelegateAsync
          {
              static int Add(int a, int b)
              {
                  Console.WriteLine ("Add() invoked on thread:{0}
      ", 
                      Thread.CurrentThread.GetHashCode ());
                  Thread.Sleep (5000);
                  return a + b;
              }
      
              static void Main()
              {
                  Console.WriteLine ("Main() invoked on thread:{0}",
                      Thread.CurrentThread.GetHashCode ());
                  //Add() call in Synchronouse mode
                  Operate op = new Operate (Add);
                  int answer = op (10, 20);
                  //after Add() executed, the folow goes on.
                  Console.Write("After Add() executed, result = {0}",answer);
                  Console.ReadKey ();
              }
          }
      }
      剖析代码的继承关系: 代理Operate经历了3次派生(绿色部分),实现了一个构造和3个虚拟函数(黄色部分).

      image
    2. 异步调用方法:线程异步了,但是主线程等待次线程返回才能获得结果,阻塞在EndInvoke上.
      using System;
      using System.Threading;
      
      namespace Demo
      {
          public delegate int Operate(int x, int y);
      
          public class DelegateAsync
          {
              static int Add(int a, int b)
              {
                  Console.WriteLine ("Add() invoked on thread:{0}
      ", 
                      Thread.CurrentThread.GetHashCode ());
                  Thread.Sleep (5000);
                  return a + b;
              }
      
              static void Main()
              {
                  Console.WriteLine ("Main() invoked on thread:{0}",
                      Thread.CurrentThread.GetHashCode ());
                  //Add() call in Synchronouse mode
                  Operate op = new Operate (Add);
                  IAsyncResult result = op.BeginInvoke(10,20,null,null);
                  Console.WriteLine ("Doing more in Main() exected immediately.");
                  //the thread susppend on EndInvoke while 'result' is ready!
                  int answer = op.EndInvoke (result);
                  Console.Write("After Add() executed, result = {0}",answer);
                  Console.ReadKey ();
              }
          }
      }

    3. 同步调用:如果线程没有返回,不要一直问何时返回,每间隔500ms做该做的事情!!!
      using System;
      using System.Threading;
      
      namespace Demo
      {
          public delegate int Operate(int x, int y);
      
          public class DelegateAsync
          {
              static int Add(int a, int b)
              {
                  Console.WriteLine ("Add() invoked on thread:{0}
      ", 
                      Thread.CurrentThread.GetHashCode ());
                  Thread.Sleep (5000);
                  return a + b;
              }
      
              static void Main()
              {
                  Console.WriteLine ("Main() invoked on thread:{0}
      ",
                      Thread.CurrentThread.GetHashCode ());
                  //Add() call in Synchronouse mode
                  Operate op = new Operate (Add);
                  IAsyncResult result = op.BeginInvoke(10,20,null,null);
                  //while result is not OK, do it every 500 ms.
                  while (!result.AsyncWaitHandle.WaitOne(500,true)) {//result.IsCompleted
                      Console.WriteLine ("Doing more work in Main().");
                  }
                  int answer = op.EndInvoke (result);
                  Console.Write("After Add() executed, result = {0}",answer);
                  Console.ReadKey ();
              }
          }
      }

    4. 线程回调: 好吧,干脆你返回的时候通知我,我该干啥不耽搁!
      using System;
      using System.Threading;
      
      /// <summary>
      /* Main() invoked on thread:1
      Main() execute no need to wait any more.
      Add() invoked on thread:3
      AddComplete() invoked on thread:3
      Your Addition is complete.
      */
      /// </summary>
      namespace Demo
      {
          public delegate int Operate(int x, int y);
      
          public class DelegateAsync
          {
              static int Add(int a, int b)
              {
                  Console.WriteLine ("Add() invoked on thread:{0}", 
                      Thread.CurrentThread.GetHashCode ());
                  Thread.Sleep (5000);
                  return a + b;
              }
      
              static void AddComplete(IAsyncResult ia)
              {
                  Console.WriteLine ("AddComplete() invoked on thread:{0}",
                      Thread.CurrentThread.GetHashCode ());
                  //Get Result value
                  System.Runtime.Remoting.Messaging.AsyncResult ar=
                      (System.Runtime.Remoting.Messaging.AsyncResult)ia;
                  Operate op = (Operate)ar.AsyncDelegate;
                  Console.WriteLine ("The value is {0}.", op.EndInvoke (ia));
              }
      
              static void Main()
              {
                  Console.WriteLine ("Main() invoked on thread:{0}",
                      Thread.CurrentThread.GetHashCode ());
                  //Add() call in Synchronouse mode
                  Operate op = new Operate (Add);
                  IAsyncResult result = op.BeginInvoke (10, 20, new AsyncCallback (AddComplete), null);
                  Console.WriteLine ("Main() execute no need to wait any more.");
                  Console.ReadKey ();
              }
          }
      }

    5. 主线程向次线程传递对象,通知!
      using System;
      using System.Threading;
      
      /// <summary>
      /*

      Main() invoked on thread:1
      Main() execute no need to wait any more.
      Add() invoked on thread:3
      AddComplete() invoked on thread:3
      The value is 30.
      The Main() thread is :1

      */
      /// </summary>
      namespace Demo
      {
          public delegate int Operate(int x, int y);
      
          public class DelegateAsync
          {
              static int Add(int a, int b)
              {
                  Console.WriteLine ("Add() invoked on thread:{0}", 
                      Thread.CurrentThread.GetHashCode ());
                  Thread.Sleep (5000);
                  return a + b;
              }
      
              static void AddComplete(IAsyncResult ia)
              {
                  Console.WriteLine ("AddComplete() invoked on thread:{0}",
                      Thread.CurrentThread.GetHashCode ());
                  //Get Result value
                  System.Runtime.Remoting.Messaging.AsyncResult ar=
                      (System.Runtime.Remoting.Messaging.AsyncResult)ia;
                  Operate op = (Operate)ar.AsyncDelegate;
                  Console.WriteLine ("The value is {0}.", op.EndInvoke (ia));
                  Thread thread = (Thread)ia.AsyncState;
                  Console.WriteLine ("The Main() thread is :{0}", thread.GetHashCode());
              }
      
              static void Main()
              {
                  Console.WriteLine ("Main() invoked on thread:{0}",
                      Thread.CurrentThread.GetHashCode ());
                  //Add() call in Synchronouse mode
                  Operate op = new Operate (Add);
                  IAsyncResult result = op.BeginInvoke (10, 20, 
                      new AsyncCallback (AddComplete),Thread.CurrentThread);
                  Console.WriteLine ("Main() execute no need to wait any more.");
                  Console.ReadKey ();
              }
          }
      }

    推荐下博客客户端工具: Download

  • 相关阅读:
    吾爱破解2018-2020优秀文章合集
    分享一个零基础入门学习Python(第2版)带课件及源码
    fiddler抓包工具详细配置方法,多图详细(转)
    浏览器提速,支持95%的国产浏览器(转)
    易语言5.92学习版
    Android Studio 之 ViewModel (转)
    一款易语言软件启动前修改(劫持DLL注入修改)【转】
    某桌球辅助登录算法分析并转本地验证
    软件虚拟机保护分析资料整理
    HttpCanary其他教程
  • 原文地址:https://www.cnblogs.com/flaaash/p/5335430.html
Copyright © 2011-2022 走看看