c#多线程实现,c#多线程调用

c#多线程实现,c#多线程调用,c#使用多线程的几种方式示例详解

这篇文章主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 设计一个简单的C#控制台应用程序,C#控制台程序,C# 创建控制台应用程序
  • 深入解析windows第8版,深入解析C#(第4版)
  • 数组代码,c# 数组操作,C# 数组实例介绍(图文)
  • 学会C#要多久,学会c#要多久,c#学习之30分钟学会XAML
  • 回溯法01背包问题c,回溯法求解01背包问题伪代码,C#使用回溯法解决背包问题实例分析
  • xml文件转义字符,xml转意字符,C# XML中的转义字符操作
  • winform 进度条控件,c# 进度条使用
  • winform 进度条控件,c# 进度条使用,C#使用winform实现进度条效果
  • winform backgroundworker,c# isbackground
  • winform backgroundworker,c# isbackground,C# BackgroundWorker用法详解
  • lua与c#交互,lua c#
  • lua与c#交互,lua c#,ToLua框架下C#与Lua代码的互调操作
  • linq c#,linq原理 c#
  • linq c#,linq原理 c#,c#中LINQ的基本用法实例
  • java decimal保留两位小数,sql中decimal函数保留2位小数,C#中decimal保留2位有效小数的实现方法
  • 留言与评论(共有 条评论)
       
    验证码: