net中异步执行(一)
来源:互联网 发布:淘宝怎么定做地毯 编辑:程序博客网 时间:2024/06/14 04:04
http://hi.baidu.com/maple0015/blog/item/7a11ed50f39a4f65853524ee.html
在写程序的过程中,我们可能会需要对某些功能实现异步操作,比如记录调用日志等。
提到异步,我们最容易想到的就是多线程:我们可以启动另外一个线程,把一部分工作交给另外一个线程去执行,而当前线程继续去做一些更加急迫的事情。这里的“把一部分工作交给另外一个线程取执行”,是通过将要执行的函数的函数入口地址告诉另外一个线程来实现的,当新的线程有了函数的入口地址,就可以调用该函数。
我们先来看一下怎样使用C#中的Thread类来实现异步。
- 使用Thread类异步执行一个方法
在C#中,Thread类是常用的用来启动线程的类:
...{
Thread thread=new Thread(new ThreadStart(myStartingMethod));
thread.Start();
}
staticvoid myStartingMethod()
...{
}
实际上,这里创建的ThreadStart对象,封装的就是方法“myStartingMethod”的入口地址。C#中通过Delegate对象,可以方便的封装函数入口地址。
而Delegate,实际上是用来描述函数定义的,比如上面提到的ThreadStart委托,他的声明如下:
这句话声明了一个叫做ThreadStart的委托类型,而且该声明表示:ThredStart这个委托类型,只能封装“返回值为void、没有参数”的函数的入口地址。如果我们给ThreadStart类的构造函数传递的方法不符合,则会出错:
...{
// 错误 “myStartingMethod”的重载均与委托“System.Threading.ThreadStart”不匹配
Thread thread=new Thread(new ThreadStart(myStartingMethod));
thread.Start();
}
staticvoid myStartingMethod(int a)
...{
}
实际上,我们在使用多线程时,要异步执行的函数往往会有一些参数。比如记录日志时,我们需要告诉另外一个线程日志的信息。
因此,Thread类除了接受ThreadStart委托,还接受另外一个带参数的委托类型ParameterizedThreadStart:
...{
Thread thread=new Thread(new ParameterizedThreadStart(myStartingMethod));
thread.Start(null);
}
staticvoid myStartingMethod(object threadData)
...{
// do something.
}
ParameterizedThreadStart 委托可以用来封装返回值为void、具有一个object类型参数的函数。这样,我们就可以往另外一个函数中传递参数了——只不过,如果要传递多个参数,我们必须将参数封装一下,弄到一个object对象中去。比如下面的例子中,本来我们需要传递两个整数的,但为了符合ParameterizedThreadStart的声明,我们需要改造一下函数:
...{
Thread thread=new Thread(new ParameterizedThreadStart(myStartingMethod));
MyStartingMethodParameterWarpper param=new MyStartingMethodParameterWarpper();
param.X=1;
param.Y=2;
thread.Start(param);
}
staticvoid myStartingMethod(object threadData)
...{
MyStartingMethodParameterWarpper param= (MyStartingMethodParameterWarpper)threadData;
int value= param.X + param.Y;
// do something
}
publicclass MyStartingMethodParameterWarpper
...{
publicint X;
publicint Y;
}
ParameterizedThreadStart委托必须与Thread.Start(Object) 方法一起使用——委托只是用来传递函数入口,但函数的参数是通过Thread.Start方法传递的。
另外需要注意的,从这里我们可以看到,这样的使用方法并不是类型安全的,我们无法保证myStartingMethod方法的参数threadData永远都是MyStartingMethodParameterWarpper 类型,因此我们还需要加上判断;另外这样实际上也加大了程序间的沟通成本:如果有人需要异步执行myStartingMethod方法,那么他就必须知道其参数的实际类型并保证参数传递正确,而这块编译器已经无法通过编译错误的方式通知你了。
.
- net中异步执行(一)
- 在.Net中使用异步(一)
- 在.Net中使用异步(一)
- asp.net 并行执行,异步执行
- springmvc中执行异步任务
- ArcGIS Runtime SDK for .NET 100.0中如何执行.gpk(一)
- Winform开发中耗时操作封装用异步执行(.net 4.0)
- ADO.NET 2.0中的异步命令执行
- ADO.NET 2.0中的异步命令执行
- Android中AsyncTask(异步执行任务)的使用
- ASP.net MVC4 AsyncController异步action无法异步执行?
- ASP.NET的异步实现方式总结(一)
- ASP.NET Ajax学习笔记(一)异步通信层
- 在.Net中使用异步
- Delphi中ADO异步执行方式
- Delphi中ADO异步执行方式
- Android 中执行异步操作 AsyncTask实现。
- Nightwatch.js 异步中调用等待执行
- 文件编码导致的sun.io.MalformedInputException异常
- Unity3D 将script 'xxx' 绑定到object上提示 Script 'xxx' has not finished compliation yet. ....
- 16. 谨记80-20规则
- 第八周实验报告4
- SQL语句 UNION 和 UNION ALL 使用
- net中异步执行(一)
- struts2 get方式传中文乱码
- 任务切换过程。
- DrawText换行显示的方法
- Linux下USB鼠标驱动完全注释
- lucene笔记
- 在Qt中设置休眠
- TabHost使用(三)
- net Winform socket 套接字聊天室客户端和服务端 源码