一 启动普通线程

ThreadStart与ParameterizedThreadStart建立新线程

优缺点:简单,但难于管理,线程过多会影响系统的性能。

二 启动CLR线程池的工作者线程(普通线程和线程池线程可以通过Thread.CurrentThread.IsThreadPoolThread区别)

1、ThreadPool.QueueUserWorkItem(WaitCallback)(Object默认为null)和 ThreadPool.QueueUserWorkItem(WaitCallback,Object)

这两个静态方法可以直接启动工作者线程 ,其中WaitCallback委托指向一个带有Object参数的无返回值方法。

举例:

public void Method(object o){ } //带object参数无返回值的方法
ThreadPool.QueueUserWorkItem(new WaitCallback(Method));

优缺点:简单方便,但委托指向的必须是一个带有Object参数的无返回值方法,不适用带多个参数及返回值的方法。

2、委托类(常用)

BeginInvoke异步调用方法,EndInvoke方法来获得返回值

举例:

private int Method(int ms){//要异步执行的方法}
private delegate int TaskDelegate(int ms);//申明委托
TaskDelegate task = new TaskDelegate(Method);//建立委托,并指向要执行的方法
IAsyncResult iar = task.BeginInvoke(,null,null);//异步调用委托,传入方法参数ms
While(!task.IsCompleted)//通过轮询方式,判断异步操作是否完成,好让主线程执行另外工作
{//否则直到异步线程完成前主线程将一直处于阻塞状态,影响执行效率
......//主线程执行代码
}
int result = task.EndInvoke(iar); //获取返回值

优缺点://使用BeginInvoke、EndInvoke方法简单方便,但是如果异步调用未完成EndInvoke将一直阻塞到其完成,因此主线程不能从事其他工作。虽然可以通过轮询方式来检测异步方法的状态让主线程工作,但非常麻烦而且效率不高。

3、回调函数

使用AsyncCallback就可以绑定一个方法作为回调函数,在回调函数中执行EndInvoke。回调函数必须是带参数IAsyncResult且无返回值的方法:void AsycnCallbackMethod(IAsyncResult result)

private delegate int TaskDelegate(int ms);//申明委托
private int Method(int ms)
{
//要异步执行的方法
}
TaskDelegate task = new TaskDelegate(Method);//建立委托,并指向要执行的方法
IAsyncResult sync = task.BeginInvoke(,new AsyncCallback(ACMethod), null);
//异步调用委托,并绑定ACMethod方法作为回调函数,这样主线程就可以继续工作不用等待了
private void ACMethod(IAsyncResult iar) //回调函数
{
AsyncResult ar = iar as AsyncResult;//类型装转换,接口IAsyncResult没有AsyncDelegate属性,但AsyncResult有
TaskDelegate task = ar.AsyncDelegate as TaskDelegate;
//因为EndInvoke需要两个参数:委托实例task和AsyncResult实例ar
int result = task.EndInvoke(ar);//获取委托方法Method的返回值
}

关于线程异步编程:委托delegate、BeginInvoke, EndInvoke, IAsycResult(监控异步,可以通过IsConpleted进行判断异步调用是否完成),AsyncCallBack委托,AsyncState 实例( 在回调函数中通过IAsyncResult.AsyncState来强制转换)。了解这些,基本就理解异步编程的真谛了。异步操作通常用于执行完成时间可能较长的任务, 如打开大文件、连接远程计算机或查询数据库。但应注意, 滥用异步, 会影响性能, 而且增加编程难度, 故应慎重考虑。

AsyncCallBack:异步回调函数的委托,引用在异步操作完成时调用的方法。

IAsyncResult:具有AsyncState属性,获取BeginInvoke方法的最后一个参数object,是启动异步操作的方法(即BeginInvoke)的返回类型(接口),当异步操作完成时,IAsyncResult对象也将传递给由AsyncCallback委托调用的方法(即回调函数的参数 )。

AsyncResult:具有AsyncDelegate属性和AsyncState属性,AsyncDelegate该属性保存在其上调用异步调用的委托对象。AsyncState属性可以获取BeginInvoke(AsyncCallback,object)的最后一个参数object。所以也可以将委托对象作为BeginInvoke最后一个参数,这样可以在回调函数中通过AsyncState获取委托对象

BeginInvoke、EndInvoke:在.net中通常以BeginXXXX开头的方法完成启动,以End开头的方法来处理结果,这两个方法可以运行在不同的线程,这样就可以实现异步编程了。

c#线程的几种启动方法的更多相关文章

  1. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  2. Service的两种启动方法

    刚才看到一个ppt,介绍service的两种启动方法以及两者之间的区别. startService 和 bindService startService被形容为我行我素,而bindService被形容 ...

  3. mongodb的几种启动方法

    1 mongodb的几种启动方法   启动Mongodb服务有两种方式,前台启动或者Daemon方式启动,前者启动会需要保持当前Session不能被关闭,后者可以作为系统的fork进程执行,下文中的p ...

  4. Java线程的三种实现方法

    Java多线程详解 线程简介 多任务,多线程 多任务情况中,虽然可以完成,但是实际上,多任务的完成是由一个一个小任务的完成来实现的,也就是说在执行多任务时,不是同时执行多个任务,而是一个时间段内只完成 ...

  5. Android 线程 thread 两种实现方法

    原文链接: http://blog.csdn.net/boyupeng/article/details/6208072 这篇文章中有三点需要提前说明一下, 一: 在android中有两种实现线程thr ...

  6. Android—— 线程 thread 两种实现方法!(转)

    原文地址:http://blog.csdn.net/boyupeng/article/details/6208072 这篇文章中有三点需要提前说明一下, 一: 在android中有两种实现线程thre ...

  7. 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类

    转自: http://blog.csdn.net/sunguangran/article/details/6069317 非常感谢原作者,整理的这么详细. 在java中可有两种方式实现多线程,一种是继 ...

  8. Task用法(1)-启动方法

    第一.基本使用 Thread,ThreadPool,Task的区别 Task是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread ...

  9. Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别

    1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...

随机推荐

  1. 续x奇数倍(n+2*x)暴力算法是冠军的算法结合数量

    // 续6单a,a+2,a+4,a+6,a+8,a+10是共同的数.最低要求a // 暴力解决方案 首先对结果,后面将代码粘贴: 1次连续n=9,连续值个数: 1;耗时: 0ms,总计: 0ms 2次 ...

  2. Java中间MD5加密算法完整版

    携带Java软件开发过程.,因此Java中提供了自带的MessageDigest实现对文本的加密算法,以下是一个对文本进行加密的MD5加密工具类代码演示样例: package net.yuerwan. ...

  3. 讨论oracle在rowid和rownum

    [ 概要 ] 刚刚接触oracle的同学可能经常会被rowid和rownum这两个词弄混, 弄清楚这两个家伙对于我们写sql会有非常大的帮助, 以下偶就抛砖引玉, 简单地谈谈他们之间的差别吧. [ 比 ...

  4. Nyoj 吝啬的国度(图论&&双DFS)

    描述在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你 ...

  5. 多重集组合数 (DP)

    输入: n=3 m=3 a={1,2,3} M=10000 输出: 6  (0+0+3,0+1+2,0+2+1,1+0+2,1+1+1,1+2+0) 为了不重复计数,同一种类的物品最好一次性处理好.于 ...

  6. zTree市县实现三个梯级DAO接口测试

    zTree市县实现三个梯级DAO接口测试 ProvinceDaoTest.java: /** * @Title:ProvinceDaoTest.java * @Package:com.gwtjs.da ...

  7. shell变量赋值进阶

    首先,要理解shell中变量的3种赋值情况: unset 例子. unset a 空字符串, null 例子. a='' 非空,即不是unset,并且不是空字符串 例子: a=1 or a=b等 然后 ...

  8. WebApi路由及版本控制

    public class WebApiControllerSelector : IHttpControllerSelector { private const string NamespaceKey ...

  9. 在Windows系统中安装集成的PHP开发环境

    原文:在Windows系统中安装集成的PHP开发环境 刚想学php的,又不会配置复杂php的环境,可以使用集成的,目前网上提供常用的PHP集成环境主要有AppServ.phpStudy.WAMP和XA ...

  10. Lucene.Net简介和分词

    Lucene.net站内搜索—2.Lucene.Net简介和分词 2015-03-24 23:10 by 邹琼俊, 118 阅读, 1 评论, 收藏, 编辑 Lucene.Net简介 Lucene.N ...