这篇文章主要介绍了c#使用多线程的几种方式,通过示例学习c#的多线程使用方式,大家参考使用吧
(1)不需要传递参数,也不需要返回参数
ThreadStart是一个委托,这个委托的定义为void ThreadStart(),没有参数与返回值。复制代码代码如下:课程计划
{
静态void Main(string[] args)
{
for(int I=0;i 30我)
{
ThreadStart ThreadStart=new ThreadStart(计算);
螺纹螺纹=新线程(threadStart);
线程. start();
}
线程。睡眠(2000);
控制台. read();
}
公共静态void计算()
{
日期时间=日期时间。现在;//得到当前时间
Random ra=new Random();//随机数对象
线程。睡眠(ra .接下来(10,100));//随机休眠一段时间
控制台WriteLine(时间。分钟:时间。毫秒);
}
}
(2)需要传递单个参数
参数ThreadStart委托定义为void ParameterizedThreadStart(对象状态),有一个参数但是没有返回值。复制代码代码如下:课程计划
{
静态void Main(string[] args)
{
for(int I=0;i 30我)
{
参数化threadstart tStart=新的参数化threadstart(Calculate);
螺纹螺纹=新线程(t启动);
线程。开始(I * 10 10);//传递参数
}
线程。睡眠(2000);
控制台. read();
}
公共静态空的计算(对象参数)
{
Random ra=new Random();//随机数对象
线程。睡眠(ra .接下来(10,100));//随机休眠一段时间
控制台WriteLine(arg);
}
}
(3)使用专门的线程类(常用)
使用线程类可以有多个参数与多个返回值,十分灵活!
复制代码代码如下:课程计划
{
静态void Main(string[] args)
{
神话阅读mt=新神话阅读(100);
ThreadStart ThreadStart=new ThreadStart(mt . Calculate);
螺纹螺纹=新线程(threadStart);
线程. start();
//等待线程结束
而(线程ThreadState!=线程状态。停止)
{
线程。睡眠(10);
}
控制台WriteLine(mt . Result);//打印返回值
控制台. read();
}
}
公共类MyThread//线程类
{
public int Parame { setget}//参数
公共int结果{ setget}//返回值
//构造函数
公共MyThread(int parame)
{
这个Parame=parame
}
//线程执行方法
公共void计算()
{
Random ra=new Random();//随机数对象
线程。睡眠(ra .接下来(10,100));//随机休眠一段时间
控制台WriteLine(这个parame);
这个。结果=这个Parame * ra .下一个(10,100);
}
}
(4)使用匿名方法(常用)
使用匿名方法启动线程可以有多个参数和返回值,而且使用非常方便!
复制代码代码如下:课程计划
{
静态void Main(string[] args)
{
int Parame=100//当做参数
int Result=0;//当做返回值
//匿名方法
ThreadStart ThreadStart=new ThreadStart(delegate()
{
Random ra=new Random();//随机数对象
线程。睡眠(ra .接下来(10,100));//随机休眠一段时间
控制台WriteLine(Parame);//输出参数
结果=Parame * ra .下一个(10,100);//计算返回值
});
螺纹螺纹=新线程(threadStart);
线程. start();//多线程启动匿名方法
//等待线程结束
而(线程ThreadState!=线程状态。停止)
{
线程。睡眠(10);
}
控制台WriteLine(结果);//打印返回值
控制台. read();
}}
(5)使用委托开启多线程(多线程深入)
1、用委托(代表)的贝京尼克和EndInvoke方法操作线程
贝京尼克方法可以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用。复制代码代码如下:课程计划
{
私有委托int新任务委托(int ms);
私有静态int newTask(int ms)
{
控制台WriteLine('任务开始');
线程。睡眠(毫秒);
Random Random=new Random();
int n=随机。下一个(10000);
控制台WriteLine('任务完成');
返回n;
}
静态void Main(string[] args)
{
新任务委托任务=新任务
IAsyncResult asyncResult=task .BeginInvoke(2000,null,null);
//EndInvoke方法将被阻塞2秒
(同Internationalorganizations)国际组织结果=任务EndInvoke(异步结果);
控制台WriteLine(结果);
控制台. read();
}
}
2、使用IAsyncResult .已完成属性来判断异步调用是否完成
复制代码代码如下:课程计划
{
私有委托int新任务委托(int ms);
私有静态int newTask(int ms)
{
控制台WriteLine('任务开始');
线程。睡眠(毫秒);
Random Random=new Random();
int n=随机。下一个(10000);
控制台WriteLine('任务完成');
返回n;
}
静态void Main(string[] args)
{
新任务委托任务=新任务
IAsyncResult asyncResult=task .BeginInvoke(2000,null,null);
//等待异步执行完成
而(!异步结果. IsCompleted)
{
控制台。写(' * ');
线程。睡眠(100);
}
//由于异步调用已经完成,因此,EndInvoke会立刻返回结果
(同Internationalorganizations)国际组织结果=任务EndInvoke(异步结果);
控制台WriteLine(结果);
控制台. read();
}
}
3、使用等等方法等待异步方法执行完成
等等的第一个参数表示要等待的毫秒数,在指定时间之内等等方法将一直等待,直到异步调用完成,并发出通知等等方法才返回没错。当等待指定时间之后,异步调用仍未完成等等方法返回假的,如果指定时间为0,表示不等待,如果为-1,表示永远等待,直到异步调用完成。
复制代码代码如下:课程计划
{
私有委托int新任务委托(int ms);
私有静态int newTask(int ms)
{
控制台WriteLine('任务开始');
线程。睡眠(毫秒);
Random Random=new Random();
int n=随机。下一个(10000);
控制台WriteLine('任务完成');
返回n;
}
静态void Main(string[] args)
{
新任务委托任务=新任务
IAsyncResult asyncResult=task .BeginInvoke(2000,null,null);
//等待异步执行完成
而(!异步结果AsyncWaitHandle。WaitOne(100,false))
{
控制台。写(' * ');
}
(同Internationalorganizations)国际组织结果=任务EndInvoke(异步结果);
控制台WriteLine(结果);
控制台. read();
}
}
4、使用回调方式返回结果
要注意的是"我的BeginInvoke(3300,MethodCompleted,my)",BeginInvoke方法的参数传递方式:
前面一部分(3,300)是其委托本身的参数。
倒数第二个参数(方法已完成)是回调方法委托类型,他是回调方法的委托,此委托没有返回值,有一个IAsyncResult类型的参数,当方法方法执行完后,系统会自动调用方法已完成方法。
最后一个参数(我的)需要向方法已完成方法中传递一些值,一般可以传递被调用方法的委托,这个值可以使用IAsyncResult .异步状态属性获得。
复制代码代码如下:课程计划
{
私有委托int MyMethod(int秒,int毫秒);
//线程执行方法
私有静态(同Internationalorganizations)国际组织方法(int秒,int毫秒)
{
控制台WriteLine('线程休眠'秒* 1000毫秒'毫秒');
线程。睡眠(秒* 1000毫秒);
Random Random=new Random();
随机返回。下一个(10000);
}
//回调方法
私有静态空的方法已完成(IAsyncResult异步结果)
{
if(异步结果==null | |异步结果.AsyncState==null)
{
控制台WriteLine('回调失败!');
返回;
}
(同Internationalorganizations)国际组织结果=(asyncResult .异步状态作为我的方法).EndInvoke(异步结果);
控制台WriteLine('任务完成,结果:'结果);
}
静态void Main(string[] args)
{
我的方法我的=方法
IAsyncResult asyncResult=my .BeginInvoke(3,300,MethodCompleted,my);
控制台WriteLine('任务开始');
控制台. read();
}
}
5、其他组件的开始XXX和EndXXX方法
在其他的。网组件中也有类似贝京尼克和EndInvoke的方法,如系统HttpWebRequest。类的开始回应和EndGetResponse方法。其使用方法类似于委托类型的贝京尼克和EndInvoke方法,例如:
复制代码代码如下:课程计划
{
//回调函数
私有静态空的请求已完成(IAsyncResult异步结果)
{
if(异步结果==null | |异步结果.AsyncState==null)
{
控制台WriteLine('回调失败');
返回;
}
HttpWebRequest hwr=asyncResult .作为HttpWebRequest的异步状态
HttpWebResponse响应=(HttpWebResponse)hwr .结束getresponse(异步结果);
StreamReader sr=新的StreamReader(响应GetResponseStream());
string str=Sr . ReadToEnd();
控制台WriteLine('返回流长度:'字符串。长度);
}
静态void Main(string[] args)
{
HttpWebRequest请求=
(http网络请求)网络请求。创建(' http://www。百度一下。com’);
//异步请求
IAsyncResult asyncResult=请求BeginGetResponse(请求完成,请求);
控制台WriteLine('任务开始');
控制台. read();
}
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。