zoukankan      html  css  js  c++  java
  • 同步,异步,回调例子

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
    using System.Runtime.Remoting.Messaging;
    
    namespace ConsoleApplication1
    {    
        class Program
        {
            public delegate int AddDelegate(int op1, int op2);//声明AddDelegate委托
    
            /// <summary>
            /// 异步调用
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                YiBu();
                Console.ReadLine();
            }
    
            #region 同步
            /// <summary>
            /// 同步调用
            /// </summary>
            /// <param name="args"></param>
            static void TongBu()
            {
                AddDelegate addDelegate = new AddDelegate(delegate(int a, int b)
                {
                    Thread.Sleep(5000);
                    return a + b;
                });
    
                int result = addDelegate.Invoke(1, 2);
                //调用Invoke之后会在此处阻塞,后面的代码需要上面的代码执行完之后才能执行,这就是同步调用的坏处:用户体验不好。
                Console.WriteLine("此内容只能等到上面的方法执行完之后才会到这里!");
                Console.WriteLine(result);
            }
            #endregion
    
            #region 异步
            /// <summary>
            /// 异步调用
            /// </summary>
            /// <param name="args"></param>
            static void YiBu()
            {
                AddDelegate addDelegate = new AddDelegate(delegate(int a, int b)
                {
                    Thread.Sleep(5000);
                    return a + b;
                });
    
                IAsyncResult result = addDelegate.BeginInvoke(1, 2, null, null);//此处是两个null
                Console.WriteLine("eee");
                int m = addDelegate.EndInvoke(result);
                //异步在调用EndInvoke后会被阻塞,后面的代码也需要等待上面的代码执行完之后才能执行。
                Console.WriteLine("此结果需要上面的代码执行完之后才会出来:" + m);
            }
            #endregion
    
            #region 回调
            static void HuiDiao()
            {
                AddDelegate addDelegate = new AddDelegate(delegate(int a, int b)
                {
                    Thread.Sleep(5000);
                    return a + b;
                });
                AsyncCallback callBack = new AsyncCallback(AddComplete);
                IAsyncResult result = addDelegate.BeginInvoke(1, 2, callBack, "111111111");
                Console.WriteLine("此段会直接输出来。不用等待上面代码执行完。此种方式,用户体验号。");
            }
            static void AddComplete(IAsyncResult result)
            {
                AddDelegate handler = (AddDelegate)((AsyncResult)result).AsyncDelegate;
                Console.WriteLine(handler.EndInvoke(result));
                Console.WriteLine(result.AsyncState);
            }
            #endregion
        }
    }

     相关文献:http://hi.baidu.com/smithallen/item/b1895d3779945cf02784f4b1

  • 相关阅读:
    leetcode: Combination Sum II
    leetcode: Combination Sum
    leetcode: Count and Say
    leetcode: Sudoku Solver
    leetcode: Linked List Cycle II
    selenium采用xpath方法识别页面元素
    selenium采用find_element_by方法识别页面元素
    selenium中webdriver识别class属性多个值中有空格的解决方案
    解决多个py模块调用同一个python的logging模块,打印日志冲突问题
    封装selenium自动化框架中的截图功能
  • 原文地址:https://www.cnblogs.com/pnljs/p/3717870.html
Copyright © 2011-2022 走看看