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

运行结果:

最新文章

  1. 用CSS正确显示人民币符号的HTML转义字符
  2. c语言中函数的递归
  3. 深入理解linux网络技术内幕读书笔记(九)--中断与网络驱动程序
  4. WCF的执行过程
  5. C# DropDownList绑定添加新数据的几种方法
  6. Request.ServerVariables[&quot;Url&quot;]
  7. [代码收藏]设为首页和加入收藏的JavaScript代码(兼容多浏览器)
  8. 【学习笔记】《JavaScript DOM 编程艺术》 ——总结
  9. 微信 python 接口 -- itchat 文档
  10. Orcle查询优化改写-----单表查询
  11. maven wrapper使用本地maven
  12. Android Studio删除依赖
  13. 痞子衡嵌入式:恩智浦半导体全系无线(BLE, Zigbee, Thread, 2.4G, Sub-1G)微控制器芯片一览
  14. error:crosses initialization of ...
  15. SP2-0734: 未知的命令开头 &quot;exp wlc/ra...&quot; - 忽略了剩余的行。
  16. iframe子页面控制父页面滚动高度,直接蹦到父页面开头
  17. iOS 点击返回键崩溃的未解之谜
  18. ATM取款机系统代码及此次作业感受
  19. springboot整合rabbitmq客户端连接报超时异常问题解决:An unexpected connection driver error occured java.net.SocketException: Socket Closed,java.util.concurrent.TimeoutException
  20. Result映射成对象和List

热门文章

  1. 零基础学python-4.5 标准类型分类
  2. 根据ip识别地区
  3. JavaScript根据Json数据来做的模糊查询功能
  4. 不为客户连接创建子进程的并发回射服务器( select实现 )
  5. Jquery源码分析-整体结构
  6. unity3d开发的android应用中增加AD系统的详细步骤
  7. 当半导体的工艺制程走到7nm后
  8. Python2.7使用virtualenv windows7
  9. 如何缓存hbase数据以减少下次取数据的时间
  10. linux 启动引导器 grub,单用户模式: