C#使用委托的形式调用线程代码实例

委托

对于委托,我们都知道他是一个引用类型,具有引用类型所具有的通性。需要知道的是它保存的不是实际值,只是是保存对存储在托管堆中的对象的引用。或说的直接点,委托就相当于叫人帮忙,让你帮你做一些事情。我这里就使用委托的形式,调用线程,来简单的说一下。

代码如下:

using System;
using System.Threading;
namespace _012_线程
{
  class Program
  {
    static void Main(string[] args) //在mian中线程是执行一个线程里面的语句的执行,是从上到下的
    {
      //通过委托 开启一个线程
      //==============可用泛型传参数(无返回值)==============
      Action threaA = ThreadTestA;
      threaA.BeginInvoke(null,null); //开启一个新的线程去执行,threaA所引用的方法
      Action<int> threaB = ThreadTestB;
      threaB.BeginInvoke(111,null, null);
      //可以认为线程是同时执行的 (异步执行)
      Console.WriteLine("异步执行");
      //================带返回值的形式====================
      //第一种方式 检测线程结束  ----- IsCompleted线程是否行完毕
      //Func<int, int> threaC = ThreadTestC;
      ////接收异步线程返回值
      //IAsyncResult returnResult = threaC.BeginInvoke(111, null, null);
      //while (!res.IsCompleted)
      //{
      //  Console.Write(".");
      //  Thread.Sleep(10); //控制子线程的检测频率,(每10ms检测一次)
      //}
      ////取得异步线程返回值
      //int result = threaC.EndInvoke(res);
      //Console.WriteLine("IsCompleted方式检测:" + result);
      //第二种方式 检测线程结束  -----  1000ms没结束就返回false,反之
      Func<int, int> threaC = ThreadTestC;
      //接收异步线程返回值
      IAsyncResult returnResult = threaC.BeginInvoke(111, null, null);
      bool isEnd = returnResult.AsyncWaitHandle.WaitOne(1000);
      int result = 0;
      if (isEnd)
      {
        result = threaC.EndInvoke(returnResult);
      }
      Console.WriteLine("EndInvoke()方式检测:" + isEnd +" "+ result);
      //第三种方式  检测线程结束  ----- 通过回调,检测线程结束
      Func<int,string, string> threaD = ThreadTestD;
      //倒数第二个参数,表示委托类型的参数,(回调函数)当线程结束的时候会调用这个委托指向的方法
      //最后一个参数,用来给回调函数传递数据
      IAsyncResult asy = threaD.BeginInvoke(111,"Czhenya", OnCallKey, threaD);
      //改为Lamdba表达式
      threaD.BeginInvoke(111, "Czhenya",(ar)=>{
        string res = threaD.EndInvoke(ar);
        Console.WriteLine("在Lamdba表达式中取得:"+res);
      },null);
      Console.ReadKey();
    }
    static void OnCallKey(IAsyncResult ar)
    {
      Func<int, string, string> thread = ar.AsyncState as Func<int, string, string>;
      string res = thread.EndInvoke(ar);
      Console.WriteLine("在回调函数中取到的结果 :"+res);
    }
    /// <summary>
    /// 一般是比较耗时的操作方法
    /// </summary>
    static void ThreadTestA()
    {
      Console.WriteLine("ThreaTestA");
    }
    static void ThreadTestB(int num)
    {
      Console.WriteLine("ThreaTestB "+num);
    }
    static int ThreadTestC(int num)
    {
      Console.WriteLine("ThreaTestC");
      Thread.Sleep(100); //让当前线程休眠(暂停线程(参数单位:ms))
      return num;
    }
    static string ThreadTestD(int num,string str)
    {
      Console.WriteLine("ThreaTestD");
      return num +" "+ str;
    }
  }
}

运行结果图:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • C#中的委托数据类型简介

    什么是委托? 委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法).通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法. 来看下面的例子,类deleMthod定义了3个方法,add.minus和multi,他们都具有相同的输入参数列表(int x,int y)和输出参数类型int,那么我们就说这三个方法具有相同的方法签名.开发者可以抽象地用 int 某名称(int x,int y) 的一种

  • 详解C#中的委托

    委托这个东西不是很好理解,可是工作中又经常用到,你随处可以看到它的身影,真让人有一种又爱又恨的感觉,我相信许多人被它所困扰过. 一提到委托,如果你学过C语言,你一定会马上联想到函数指针. 什么是委托?委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.委托可以把函数做为参数传递,其实际意义便是让别人代理你的事情.委托可以看做是函数的指针,整数可以用整数变量指向它,对象可以用对象变量指向它, 函数也可以用委托变量指向它.我们可以选择将委托类型看做只定义了一个方法的接口,而委托的实

  • C# WPF 通过委托实现多窗口间的传值的方法

    在使用WPF开发的时候就不免会遇到需要两个窗口间进行传值操作,当然多窗口间传值的方法有很多种,本文介绍的是使用委托实现多窗口间的传值. 在上代码之前呢,先简单介绍一下什么是C#中的委托(如果只想了解如何传值可以略过这部分)在网络上有很多对于委托的介绍和讲解,经过我的学习和总结加上了一点我自己的理解,我认为委托是一种类似于C语言的指针,但是它指向的是方法而不是变量.如果把委托看作一个变量,那么这个变量里存着的就是你目标方法的地址,调用委托约等于调用你的目标方法.(个人理解欢迎指正交流) 以下正文:

  • c#中的泛型委托详解

    今天学习一下c#中的泛型委托. 1.一般的委托,delegate,可以又传入参数(<=32),声明的方法为  public delegate void SomethingDelegate(int a); using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace delegateSummary { publ

  • 详解C#中委托,事件与回调函数讲解

    .Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等. "protected void Page_Load(object sender, EventArgs e)"这段代码相信没有人不熟悉的.细心一点一定会发现,非常多的事件方法都是带了"object sender, EventArgs e"这两个参数.这是不是和委托非常相似呢? 一.委托(有些书中也称为委派)

  • C#沉淀之委托的深入讲解

    什么是委托 要传递方法,就必须把方法的细节封装在一钟新类型的对象中,即委托.委托是一种特殊类型的对象,其特殊之处在于,我们以前定义的所有对象都包含数据,而委托只包含一个或多个方法的地址. .NET版本中,委托指向方法的地址.在C++中,函数指针是一个指向内存位置的指针,但它不是类型安全的.开发者无法判断这个指针实际指向什么,像参数和返回值等项就更不知道了. .NET委托是类型安全的类,它定义了返回类型和参数的类型.委托类不仅包含对方法的引用,也可以包含对多个方法的引用. 可以认为委托是持有一个或

  • C#匿名委托与Lambda表达式详解

    通过使用匿名委托(匿名方法),使编程变得更加灵活,有关委托与匿名委托请参考我的前一篇Blog<委托与匿名委托>. 继续之前示例,代码如下: static void Main(string[] args) { Worker.TwoNumberHandleMethodDelegate method = delegate(int a, int b) { return a + b; }; Worker worker = new Worker(); int result = worker.HandleT

  • C#中委托(Delegates)的使用方法详解

    1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的角度不同.个人认为,可以从以下2点来理解: (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型. (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象. 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址.调用委托的时候,委托包含的所有方法将被执行. 2. 委托类型的定义 委托是类型,就

  • 详解C#中通过委托来实现回调函数功能的方法

    委托(delegate)是一种可以把引用存储为函数的类型,这类似于c++中的函数指针. 回调函数 c++中的回调函数,就是用函数指针来实现的.类似的,c#中用委托,来实现回调函数的功能. 回调函数为什么被称为回调函数?比如你调用了一个函数,那么就叫调用,但是如果你在调用一个函数的时候,还需要把一个函数提供给该函数,让这个函数来调用你的函数,那么你提供的这个函数就被称为回调函数(callback). 对于python这样的动态语言而言,就没有c#,c++提供特殊的语法实现回调函数,因为在pytho

  • 浅谈C#中的委托、事件与异步

    从刚接触c#编程到现在,差不多快有一年的时间了.在学习过程中,有很多地方始终似是而非,直到最近才弄明白. 本文将先介绍用法,后评断功能. 一.委托 基本用法: 1.声明一个委托类型.委托就像是'类'一样,声明了一种委托之后就可以创建多个具有此种特征的委托.(特征,指的是返回值.参数类型) public delegate void SomeKindOfDelegate(string result); 2.创建一个在1中创建的委托类型的委托. public SomeKindOfDelegate aD

  • c# 委托详解

    委托是一个类型.C#中的委托是面向对象的,并且它是类型安全的 当创建委托实例的时候,创建的实例会包含一个调用列表,在调用列表中可以包含多个方法.每个方法称作一个调用实体.调用实体可以是静态方法,也可以是实例方法.如果是实例方法,则该调用实体包含调用该实例方法的实例.委托并不关心它所调用方法所属的类,它只关心被调用方法与委托的类型是否兼容. 下面是代码实例: using System; namespace LycheeTest{ public delegate void D(int a, int

  • C#基于委托实现多线程之间操作的方法

    本文实例讲述了C#基于委托实现多线程之间操作的方法.分享给大家供大家参考,具体如下: 有的时候我们要起多个线程,更多的时候可能会有某个线程会去操作其他线程里的属性. 但是线程是并发的,一般的调用是无法实现我们的要求的. 于是,我们在这里就可以用委托,代码如下 private delegate void DelegateInfo(); private delegate void DelegateIsEnd(); //这个是线程调用其他线程的方法 private void Dowork() { //

  • C#委托与匿名委托详解

    本来是想写一篇<委托与lambda表达式的前世今生>,但仅委托部分已经写了很多内容,于是就此分开关于Lambda表达是的内容后续再写吧. 不知道Lambda表达式是谁发明的,只记得第一次接触Lambda表达式是在使用VS2008的时候,那就先认为是微软发明的吧. Lambda表达式从我接触开始到现在变得越来越流行,Java8中开始支持.kotlin更是对C#,F#做了广泛的抄袭(C#曾几何时不也如此对待过Java嘛).其实这都充分说明了,Lambda表达式的重要性.要搞清楚Lambda首先需要

随机推荐