zoukankan      html  css  js  c++  java
  • C#基础:线程之异步委托

    线程:是程序中独立的指令流。在我们熟悉的Visual Studio编辑器中输入C# 代码的时候,系统会自动分析代码,提示你输入的代码出现的各种错误,这是一个后台线程完成的。

      创建线程的一种简单的方式就是定义一个委托,并一部调用它。Delegate类支持异步调用方法,在后台,Delegate类会创建一个执行任务的线程。

    为了说明委托的异步性,从一个需要一定时间的方法讨论,方法如下所示:

    复制代码
    static int TakesAWhile(int data, int ms)
    {
         Console.WriteLine("TakesAWhile start");
         Thread.Sleep(ms);
         Console.WriteLine("TakesAWhile completed");
         return ++data;
    }
    复制代码

      

      TakesAWhile方法需要两个ms毫秒后才能执行完成。

      需要从委托中调用TakesAWhile方法,需要定义一个相同参数和返回值类型的委托,如下面的代码所示:

    public delegate int TakesAWhileDelegate(int data, int ms);

      

      当然我们还可以直接使用Func<int,int,int>来引用TakesAWhile方法。

      Delegate类提供了BeginInvoke()方法和EndInvoke()方法。BeginInvoke()方法可以传递委托类型定义的输入参数。BeginInvoke()方法是有返回值的,返回值为IasyncResult,通过IasyncResult,我们可以获取该委托的相关信息,并检验该委托是否完成了相关的任务,从而我们就需要使用IasyncResult的IsCompleted方法来检验委托是否已经完成了任务。从EndInvoke()方法获取委托执行完成后的返回值。BeginInvoke()方法没有执行完之前,EndInvoke()方法就会一直被阻塞。从下面的代码运行结果可以看出,只要委托还没有完成任务,程序的主线程就会继续执行while循环。

    代码示例:

    复制代码
    class Program
        {
            static void Main(string[] args)
            {
                Func<int, int, int> d1 = TakesAWhile;//声明委托并应用方法
                IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);//给引用的方法传值并返回数据类型为IAsyncResult的返回值
                int i = 0;
                while (!ar.IsCompleted)//判断委托的任务是否执行完成,若执行完成,跳出循环
                {
                    Console.Write(i+++" ");
                    Thread.Sleep(50);//每50毫秒检查一次
                }
                int result = d1.EndInvoke(ar);//从EndInvoke()方法中获取委托执行的返回值
                Console.WriteLine("Result:{0}",result);//输出返回结果
            }
            static int TakesAWhile(int data, int ms)
            {
                Console.WriteLine("TakesAWhile start");
                Thread.Sleep(ms);
                Console.WriteLine("TakesAWhile completed");
                return ++data;
            }
        }
    复制代码

    运行结果:

  • 相关阅读:
    系统架构师基础到企业应用架构表现层
    网站性能优化之应用程序缓存中篇
    系统架构师基础到企业应用架构企业应用架构
    系统架构师基础到企业应用架构服务层
    http的请求和响应过程管道
    反射获取信息图(转)
    白话学习MVC(二)页面周期一
    Asp.Net请求原理and页面生命周期(转)
    前后台互访
    HttpApplication事件&ASP.NET页面周期
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9794475.html
Copyright © 2011-2022 走看看