C#关于多线程基础

进程:就是一个独立功能的程序
线程:进程中的一个实体,
***一个进程中可以包含多个线程

总结:
1、一个程序至少有一个进程,一个进程至少有一个线程
2、进程拥有独立的内存单元(多个应用程序互不影响),进程中的多线程是共享内存(一个线程死掉,整个进程死掉)
3、线程的执行必须依存于进程中,有进程控制执行多个线程
4、多线程意义:在一个进程中,让多个任务同时执行

线程分类:
前台线程:所有前台线程执行完毕——应用程序可以退出
后台线程:应用程序结束——后台线程自动结束
设置前后台线程:IsBackground = false/true;
***线程创建默认为——前台线程
线程的创建——Thread 

?使用多线程:如果一个任务消耗时间较长——多线程(其他线程中操作消耗时间较长的任务)

Join:在哪个线程中出现了,那么当前线程要等Join的函数执行完成后,才会继续向下执行。

委托方式发起线程-异步委托

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 异步委托{
	class Program{
		static void Test(int i,string str){
			Console.WriteLine("test" + i + str);
			Thread.Sleep(100);
			return 100;
		}
		
		static void Main(string[] args){
			Func<int,string,int> a = Test; //通过委托开启一个线程
			IAsyncResult ar = a.BeginInvoke(100,"andi",null,null);
			Console.WriteLine("main");
			While(ar.IsCompleted == false){
				Console.Write(".");
				Thread.Sleep(10);	
			}
			int res = a.EndInvoke(ar);
			Console.WriteLine(res);
			Console.ReadKey();
		}
	}
}

第一种线程方式:Thread t =  new Thread(func);

using System;
using System.Threading;

namespace Thread创建线程{
	class Mainclass{
		public static void func1(){
			Thread.Sleep(5000); //让线程停止5秒
			for(int i = 0;i<100;i++){
				Consolo.WriteLine("___:"+i);
			}
		}
		public static void func2(){
			for(int i = 0;i<100;i++){
				Consolo.WriteLine(":"+i);
			}
		}
		public static void Main (string[] args){
			//线程:前台
			Thread t =  new Thread(func1);
			t.IsBackground = true;
			t.Start();
			t.Join();//Main函数等t执行完再结束

			Thread t1 =  new Thread(func2);
			t1.Start();
			Consolo.WriteLine("主函数结束");
		}
	}
}

第二种线程方式:Thread(ParameterizedThreadStart)

using System;
using System.Threading;

namespace test{
	class Mainclass{
		public void func(object o){
			Thread.Sleep(2000);			
			Consolo.WriteLine(o);
		}
		
		public static void Main (string[] args){
			Thread t =  new Thread(new ParameterizedThreadStart(func));
			t.Start("object");
			Consolo.WriteLine("主函数结束");
		}
	}
}

第三种线程方式:线程的容器——线程池

using System;
using System.Threading;

namespace test{
	class Mainclass{
		public void func(object o){
			Thread.Sleep(2000);			
			Consolo.WriteLine(o);
		}
		public void func1(){	
			Consolo.WriteLine("func1");
		}
		public void func2(object o){
			Consolo.WriteLine(o);
			Consolo.WriteLine("func2");
		}

		public static void Main (string[] args){
			//线程池  默认为后台线程
			ThreadPool.QueueUserWordItem(func1);
			ThreadPool.QueueUserWordItem(func2,"Young");
			Thread.Sleep(2000);
			Consolo.WriteLine("主函数结束");
		}
	}
}

第四种线程方式:任务Task

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 任务{
	class Program{
		static void ThreadMethod(){
			Console.WriteLine("任务开始" + Thread.CurrentThread.ManagedThreadId);
			Thread.Sleep(2000);
			Console.WriteLine("任务结束");
		}
		
		
		static void Main(string[] args){
			//第一种
			Task t = new Task(ThreadMethod);//传递一个需要线程去执行的任务
			t.Start();
			//第二种工厂模式
			TaskFactory tf = new TaskFactory();
			Task t = tf.StartNew(ThreadMethod);		

			Console.WriteLine("Main");
			Console.ReadKey();
		}
	}	
}

猜你喜欢

转载自blog.csdn.net/vrandi/article/details/81627194
今日推荐