C#中Thread(线程)和Task(任务)实例详解
目录
- 线程
- 一,使用Thread类启动线程和数据传输
- 二,线程池ThreadPool类
- 任务
- 一,创建并启动任务
- 二,连续任务
- 三,资源冲突问题
- 总结
线程
线程:对于所有需要等待的操作,例如移动文件,数据库和网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务。一个进程的多个线程可以同时运行在不同的CPU上或多核CPU的不同内核上。
一个应用程序启动时,会启动一个进程(应用程序的载体),然后进程会启动多个线程。
一,使用Thread类启动线程和数据传输
使用Thread类可以创建和控制线程,Thread构造函数是一个无参无返回值的委托类型。
1️⃣对Thread传入一个无参无返回类型的方法-ThreadStart。
public delegate void ThreadStart();
实例:
static void test() { Console.WriteLine("test is start"); Console.WriteLine("test is running"); Thread.Sleep(3000); Console.WriteLine("test is completed"); } static void Main(string[] args) { Thread th = new Thread(test); th.Start(); Console.WriteLine("main is completed"); }
2️⃣对Thread传入一个匿名方法(或lambda表达式)。用于传入的方法代码简单的情况
static void Main(string[] args) { //lambad表达式 Thread th = new Thread(()=> { Console.WriteLine("子线程1-ID:" + Thread.CurrentThread.ManagedThreadId); }); th.Start(); //匿名方法 Thread th2 = new Thread(delegate () { Console.WriteLine("子线程2-ID:" + Thread.CurrentThread.ManagedThreadId); }); th2.Start(); Console.WriteLine("main is completed"); }
3️⃣对Thread传入一个无返回值有参方法-ParameterizedThreadStart,该参数只能是object类型且只能有一个参数。
public delegate void ParameterizedThreadStart(object? obj);
实例:
static void download(object o) { string str = o as string; Console.WriteLine("地址:" + str); } static void Main(string[] args) { Thread th = new Thread(download); th.Start("http://baidu.com"); Console.WriteLine("main is completed"); }
注意:使用as进行强制类型转换 成功会正确输出,失败会输出null。
以上数据传输的方法都是基于静态变量进行传输的,但是定义过多静态变量会导致多个线程访问同一个静态变量,造成资源冲突。
静态变量虽然方便访问,但是静态的一般都是公共的,容易混乱。
4️⃣对Thread传入一个无返回值多个参数的方法(定义一个结构体),但是不能用as强制转换。
public struct data { public string message; public int age; } static void download(object o) { data str = (data)o;//强制类型转换 Console.WriteLine("信息:" + str.message); Console.WriteLine("年纪:" + str.age); } static void Main(string[] args) { data da = new data(); da.message = "sss"; da.age = 3; Thread th = new Thread(download); th.Start(da); Console.WriteLine("main is completed"); }
由于结构体是值类型,不能为null,因此不能用as进行强制类型转换。
5️⃣通过自定义类传递数据(即将通过线程调用一个类的成员方法)
先创建一个download类:
class downLoad { public string URL { get; private set; } public string Message { get; private set; } //构造函数 public downLoad(string uRL, string message) { URL = uRL; Message = message; } //下载方法 public void load() { Console.WriteLine("从" + URL + "获取信息:" + Message); } }
在主程序中将该类的成员方法传入Thread中:
static void Main(string[] args) { var download = new downLoad("www.baidu.com", "mp4"); Thread th = new Thread(download.load); th.Start(); Console.WriteLine("main is completed"); Console.ReadKey(); }
赞 (0)