能够认为线程是一个虚拟进程,用于独立运行一个特定的程序。c#
1.使用c#建立线程函数
using System; using System.Threading; //3 namespace MutiThreadDemo { class Program { static void Main(string[] args) {
//5 Thread t = new Thread(PrintNumber); t.Start(); PrintNumber(); Console.ReadLine(); } //4 static void PrintNumber() { Console.WriteLine("Starting ..."); for(int i = 1;i< 10; i++) { Console.WriteLine(i); } } } }
在上面的代码中,步骤4定义了方法 PrintNumber , 该方法会被主线程和新建立的线程使用。spa
在咱们构造一个线程时,ThreadStart 或 ParameterizedThreadStart 的实例委托会传给构造函数。操作系统
咱们只需指定在不一样线程运行的方法名,而 c# 编译器则会在后台建立这些对象。线程
运行结果:两组范围为1 -10的数字会随机交叉输出。这说明了PringNumber方法同时运行在主线程和另外一个线程。(若是10个数字随机交叉不明显,能够增长到100试试)code
2.暂停线程对象
这里展现如何让一个线程等待一段时间而不用消耗操做系统资源。blog
using System; using System.Threading; namespace MutiThreadDemo { class ThreadSleep { static void Main(string[] args) { Thread t = new Thread(PrintNumbersWithDelay); t.Start(); PrintNumbers(); Console.ReadLine(); } static void PrintNumbers() { Console.WriteLine("Starting ..."); for (int i = 0; i < 10; i++) { Console.WriteLine(i); } } static void PrintNumbersWithDelay() { Console.WriteLine("Starting ..."); for(int i = 0; i < 10; i++) { Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine(i); } } } }
在PrintNumbersWithDeplay方法中加入了Thread.Sleep方法调用。这会致使线程在执行该代码时,在打印任何数字以前会等待指定的时间(这里是2秒钟)。进程
3.线程等待资源
这里将展现如何让程序等待另外一个程序中的计算完成,而后在代码中使用该线程的计算结果。
使用Thread.Sleep行不通,由于并不知道计算须要花费的具体时间。
using System; using System.Threading; namespace MutiThreadDemo { class Thread_Join { static void Main(string[] args) { Console.WriteLine("Starting ..."); Thread t = new Thread(PrintNumbersWithDeplay); t.Start(); t.Join(); Console.WriteLine("Thread completed"); Console.ReadLine(); } static void PrintNumbersWithDeplay() { Console.WriteLine("Starting ..."); for (int i = 1; i < 10; i++) { Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine(i); } } } }
运行结果:
当程序运行时,启动了一个耗时较长的线程来打印数字,打印每一个数字前要等待两秒。
可是咱们在主程序中调用了 t.Join 方法,该方法容许咱们等待直到线程 t 完成。
当线程 t 完成时,主程序会继续运行。
借助该技术能够实如今两个线程间同步执行步骤。
4.终止线程
...