线程:是程序中独立的指令流。在我们熟悉的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;
}
}

运行结果:

C#基础:线程之异步委托的更多相关文章

  1. c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调

    单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...

  2. C# Invoke 使用 异步委托

    如果使用多线程,应该会遇到这样的一个问题,在子线程中想调用主线程中(Form1)控件,提示报错! 可以使用Invoke方法调用. this.Invoke(new MethodInvoker(() =& ...

  3. C#基础之--线程、任务和同步:一、异步委托

    创建线程的一种简单方式是定义一个委托,并异步调用它.委托是方法的类型安全的引用. Delegate还支持异步地调用方法.在后台Delegate类会创建一个执行任务的线程. 为了说明委托的异步特性,从一 ...

  4. C#中的线程一(委托中的异步)

    C#中的线程一(委托中的异步) 一.同步委托 我们平时所用的委托以同步居多,我们编写一个方法和相关委托进行演示: publicdelegatevoid DoSomethingDelegate(stri ...

  5. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  6. 使用异步委托执行线程(delegate)

    由于异步委托产生的线程与应用程序主线程是分开执行的,若主线程要获取异步委托线程的结果,则主线程需要等待异步委托的执行结果. BeginInvoke是Delegate类型的一个方法,它的返回类型为IAs ...

  7. 线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading

    入门-------------------------------------------------------------------------------- 概述与概念    一个C#程序开始 ...

  8. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

  9. net .异步委托知识

    以前在编程中,异步用的比较少,导致C# 一些基础的 东西用法都不怎么熟悉,经常要用的时候在去查找资料比较被动,而已没真正里面理解起来,始终感觉不是自己的知识 (题外话) 首先委托关键字  Delega ...

随机推荐

  1. JAVA sql语句动态参数问题

    对sql语句设置动态参数 import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverMan ...

  2. 关于mongorc.js文件详解

    最近阅读了<<mongodb权威指南第二版>>,发现这本书比之前的第一版好,很多地方讲解很详细.下面就翻译下谈下这个文件. 首先,启动shell的时候,mongorc.js文件 ...

  3. teradata培训文档 相关索引

    teradata培训文档 http://wenku.baidu.com/view/ec44c201cc175527072208ba.html Teradata 和Greenplum 的讨论 http: ...

  4. 使用C#解决部分Win8.1系统窗体每隔几秒失去焦点的问题

    使用了Win8.1 With Update 1后,发现重新启动系统后,当前激活的窗体总是每隔几秒失去焦点.过0.5~1秒焦点回来.导致输入无法正常工作,严重影响使用心情和效率. 在网上找了非常久,也没 ...

  5. android日历控件

    源码地址 : http://download.csdn.net/detail/abc13939746593/7265459

  6. DuiLib笔记之设置文本字体

    设置文本字体要用到Font 它的常用属性如下 id 用于标识Font,类型:INT name 用于指定字体名称,类型:STRING size 用于指定字体大小,类型:INT bold 用于指定是否加粗 ...

  7. java web项目初始化启动一个java方法

    项目中需要一些初始化数据,或者加载中断的任务. 首先在web.xml中配置信息,配置在<web-app>中: <servlet> <servlet-name>Ini ...

  8. STM32 ~ 如何从ST网站找到对应的固件库

    ST官方网站改版后,基本上很难搜索到固件库的地址,找了半天才找到固件库的下载地址,通过此方法可以找到其他需要的资源,故记下来方便大家. 下载的网站地址为: Home>Tools and Soft ...

  9. vue路由的两种模式,hash与history

    对于Vue 这类渐进式前端开发框架,为了构建SPA(单页面应用),需要引入前端路由系统,这也就是Vue-router存在的意义.前端路由的核心,就在于——— 改变视图的同时不会向后端发出请求. 一.为 ...

  10. codeforces B. Coach 解题报告

    题目链接:http://codeforces.com/problemset/problem/300/B 题目意思:给出n个students(n%3 = 0),编号依次为1-n,接下来有m行,每行有两个 ...