多线程编程学习笔记-基础(一)
2018-06-17 19:04:53来源:未知 阅读 ()
一、多线程介绍
C#通过多线程支持并行执行的代码。一个线程是一个独立执行的路径,可以同时与其他线程一起运行。一个C#客户端程序(Console,WPF,Winows Forms)开始于一个单独的线程,该线程由CLR和操作系统自动地创建,我们称它为主线程,而且可以通过创建附加的线程来实现多线程。
二、初探
1.创建第一个多线程程序
2.打开visual studio 2015。新建一个控制台应用程序ThreadConsoleApp。如下图。
3.此项目使用.net framework 4.5.2。
4.代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //引入线程 namespace ThreadConsoleApp { class Program { static void Main(string[] args) { //创建一个线程来运行PrintNumber,当我们构造一个线程时,ThreadStart或ParameterizedThreadStart实例委托会传给构造函数 //我们只需要指定不同线程需要运行的方法名,如下所示。编译器会自动在后台创建这些对象。 Thread t = new Thread(PrintNumber); //启动线程 t.Start(); PrintNumber(); Console.Read(); } static void PrintNumber() { Console.WriteLine("第一个多线程程序开始。。。。"); for (int i = 0; i <20; i++) { long time = DateTime.Now.Ticks; Console.WriteLine(string.Format("Ticks:{0} == {1}",time,i)); } } } }
5.程序运行结果如下
从上图的结果图中可以看出来,两组范围为20的数字是随机交替出现的,说明PrintNumber方法即运行在主线程中,又运行中子线程中。
三、暂停线程(Sleep)
1.代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //引入线程 namespace ThreadConsoleApp { class Program { static void Main(string[] args) { Thread t = new Thread(PrintNumberDely); //启动线程 t.Start(); PrintNumber(); Console.Read(); } static void PrintNumber() { Console.WriteLine("第一个多线程程序开始。。。。Second:" + DateTime.Now.Second); for (int i = 0; i <10; i++) { Console.WriteLine(string.Format("{0}",i)); } } /// <summary> /// 暂停2秒的方法 /// </summary> static void PrintNumberDely() { Console.WriteLine("第一个多线程暂停程序开始。。。。"); for (int i = 0; i < 10; i++) { Console.WriteLine(string.Format("Second:{0} == {1}", DateTime.Now.Second, i)); Thread.Sleep(TimeSpan.FromSeconds(2)); } } } }
2.结果如下。
图1
图2
看结果图,如上面2图。当程序运行时,创建一个子线程运行PrintNumberDely()方法,然后执行PrintNumber,但是由于PrintNumberDely方法中存在暂停代码,所以每隔2秒才打印一个数字。
四、线程等待(Join)
1.代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //引入线程 namespace ThreadConsoleApp { class Program { static void Main(string[] args) { Console.WriteLine("开始"); Thread t = new Thread(PrintNumberDely); //启动线程 t.Start(); //线程等待 t.Join(); Console.WriteLine("结束"); Console.Read(); } /// <summary> /// 暂停2秒的方法 /// </summary> static void PrintNumberDely() { Console.WriteLine("第一个多线程等待程序开始。。。。"); for (int i = 0; i < 10; i++) { Console.WriteLine(string.Format("Second:{0} == {1}", DateTime.Now.Second, i)); Thread.Sleep(TimeSpan.FromSeconds(2)); } } } }
2.程序运行结果如下图。
看结果图,当程序运行时,创建一个子线程运行PrintNumberDely()方法,但是由于我们调用了t.join()方法,所以主线程就会阻塞,直到子线程执行完毕,主线程才会继续执行,最后打印出“结束”。使用此技术,可以实现两个线程的同步执行,第一个线程等另一个线程执行完毕,才继续执行。
注释join()方法,程序的运行结果如上图。请自行比较两个结果的区别。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:简单的自定义Session
- Delphi10.3的ListView学习(大图标) 2020-06-05
- Delphi10.3的SpeedButton/BitBtn学习 2020-06-05
- uniGUI学习之UniStringGrid(35) 2020-04-15
- uniGUI学习之uniButton图标(34) 2020-04-09
- UniGUI学习之hbox布局(33) 2020-04-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash