• 委托的异步执行


        public delegate int mydelegate(int x, int y);
        class Program
        {
          
            static void Main(string[] args)
            {
                Console.WriteLine("Main中正在执行的线程ID:{0}",Thread.CurrentThread.ManagedThreadId);
                ///实例化一个委托
                mydelegate d = new mydelegate(Add);
                //委托的同步调用
                //int resuit = d.Invoke(2, 4);
                //Console.WriteLine("2+4 is={0}",resuit);
    
                ///委托的异步调用
                ///生成BeginInvoke的方法是 public IAsyncResult BeginInvoke(int x,int y,AsyncCallBack cb,Object state)
                ///生成EndInvoke的方法是 public int EndInvoke(IAsyncResult result)
                ///BeginInvoke和EndInvoke是一种耦合机制,EndInvoke需要一个IAsyncResult类型参数,BeginInvoke返回的是IAsyncResult
                //IAsyncResult IResuit = d.BeginInvoke(2, 3, null, null);
                //int AsyncResuit = d.EndInvoke(IResuit);
                //Console.WriteLine("2+4 is={0}",AsyncResuit);
    
                ///同步调用线程
                ///
                //IAsyncResult IResuit = d.BeginInvoke(2, 4, null, null);
                //while (!IResuit.IsCompleted)
                //{
                //    Console.WriteLine("Doing more work in Main()");
                //    Thread.Sleep(1000);
                //}
                //int AsyncResuit = d.EndInvoke(IResuit);
                //Console.WriteLine("2+4 is={0}", AsyncResuit);
    
    
                //IAsyncResult IResuit = d.BeginInvoke(2, 4, null, null);
                //while (IResuit.AsyncWaitHandle.WaitOne(1000, true))
                //{
                //    Console.WriteLine("Doing more work is Main");
                //}
    
                ///当BeginInvoke处理完数据后调用AsyncCallback
                ///通过次线程通知主线程,这样子比主线程频繁询问次线程要好些。
                IAsyncResult IResuit = d.BeginInvoke(2, 3, new AsyncCallback(AddComplete), null);
    
    
                //int AsyncResuit = d.EndInvoke(IResuit);
                //Console.WriteLine("2+4 is={0}", AsyncResuit);
    
                Console.ReadKey();
            }
          
            static void AddComplete(IAsyncResult resut)
            {
                Console.WriteLine("addComplete线程ID:{0}",Thread.CurrentThread.ManagedThreadId);
                Console.WriteLine("you addition is complete");
                /// AsyncResult定义在了System.Runtime.Remoting.Messaging;
                /// 该类的mydelegate返回了原始异步委托的应用,这个地方就是
                /// public delegate int mydelegate(int x, int y);
                /// 这样子写的原因是BeginInvoke处理完了后,会调用AsyncCallback,但是他访问不到定义在Main中的EndInvoke
                AsyncResult r = (AsyncResult)resut;
                mydelegate b = (mydelegate)r.AsyncDelegate;
                Console.WriteLine(b.EndInvoke(resut));
            
            }
    
            static int Add(int x, int y)
            {
                Console.WriteLine("Add方法中正在执行的线程ID:{0}",Thread.CurrentThread.ManagedThreadId);
    
                //暂停一下,模拟一个耗时的操作
                Thread.Sleep(5000);
                return x + y;
            }
           
        }
  • 相关阅读:
    mysql常用命令
    怎么在cmd中输入mysql就可以进去mysql控制台
    ORA-01659: 无法分配超出 7 的 MINEXTENTS
    Oracle修改表空间自增长
    整理下.net分布式系统架构的思路
    Net分布式系统之一:系统整体框架介绍
    QT QTreeWidget 的一个例子 显示文件(夹)的树形结构
    待读 QT 博客
    如何为 QT5 装上 QT4 才有的库
    Python 获取文件夹里所有 log 的起止时间戳
  • 原文地址:https://www.cnblogs.com/xinyebs/p/3118944.html
Copyright © 2020-2023  润新知