• 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;
            }
        }
    复制代码

    运行结果:

  • 相关阅读:
    微服务架构技术栈选型手册(万字长文)
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    MFC对话框中使用CHtmlEditCtrl
    ATL开发 ActiveX控件的 inf文件模板
    ActiveX: 如何用.inf和.ocx文件生成cab文件
    Xslt 1.0中使用Array
    如何分隔两个base64字符串?
    An attempt was made to load a program with an incorrect format
    JQuery 公网 CDN
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9794475.html
Copyright © 2020-2023  润新知