经常使用的组织函数有:
// 择要: // 初始化 System.Threading.Thread 类的新实例,指定许可对象在线程启动时通报给线程的托付。//// 参数: // start:// System.Threading.ParameterizedThreadStart 托付,它示意此线程最先实行时要挪用的要领。//// 非常: // System.ArgumentNullException:// start 为 null。 [SecuritySafeCritical]public Thread(ParameterizedThreadStart start);//// 择要: // 初始化 System.Threading.Thread 类的新实例。//// 参数: // start:// System.Threading.ThreadStart 托付,它示意此线程最先实行时要挪用的要领。//// 非常: // System.ArgumentNullException:// start 参数为 null。 [SecuritySafeCritical]public Thread(ThreadStart start);
1. 无参数建立线程
ThreadStart托付定义了一个返回范例位void的无参数要领。
public void Main() { Thread vThread = new Thread(ThreadFun);//vThread.Name = "td_Name"; // 线程称号vThread.Start(); //最先实行线程Console.WriteLine("This is the main thread:id=" + Thread.CurrentThread.ManagedThreadId); }void ThreadFun() // 来自托付:ThreadStart { Console.WriteLine("Running in a new thread:id=" + Thread.CurrentThread.ManagedThreadId);for (int i = 0; i < 10; i++) { Console.Write("."); Thread.Sleep(500); } Console.WriteLine("THREAD END"); }
输出效果:
将上诉代码中的 ThreadFun() 用Lambda表达式替代,变成Thread的轻便运用体式格局:
public void Main() { Thread vThread = new Thread(() =>{ Console.WriteLine("Running in a new thread");});//vThread.Name = "td_Name"; // 线程称号vThread.Start(); //最先实行线程Console.WriteLine("This is the main thread"); }
2.给线程通报参数
两种体式格局:一种是运用带ParameterizedThreadStart托付的要领参数组织Thread;另一种是建立一个自定义类,把线程的要领定义为实例要领,如许先初始化实例的数据,在启动线程。
如:通报参数
public struct TdData // 通报数据 {public string Message; //数据string字段}
运用第一种体式格局:
public void Main() { TdData tData = new TdData() { Message = "Thread Info" }; Thread vThread = new Thread(ThreadFun); vThread.Start(tData); // 最先实行线程,通报参数Console.WriteLine("This is the main thread"); }void ThreadFun(object pObj) // 来自托付:ParameterizedThreadStart { TdData vData = (TdData)pObj; Console.WriteLine("In a new thread, Received:{0}", vData.Message); }
运用第二种体式格局:先自定义一个类。
public class TdHelper {public TdData mData; // 通报数据// 组织函数public TdHelper(TdData pData) {this.mData = pData; }public void ThreadFun() // 来自托付:ThreadStart { Console.WriteLine("In a new thread, TdDataMessage:{0}", mData.Message); } }
然后,在主线程(须要的处所)建立Thread并将实例要领TdHelper.ThreadFun()作为组织函数的参数。
public void Main() { TdData tData = new TdData() { Message = "Thread Info" }; TdHelper tHelper = new TdHelper(tData); // 通报参数Thread vThread = new Thread(tHelper.ThreadFun); vThread.Start(); Console.WriteLine("This is the main thread"); }
3.背景线程
默许情况下,Thread类建立的线程事前台线程,线程池中的线程老是背景线程。只需有一个前台线程在运转,应用顺序的历程就在运转,假如多个前台线程在运转,而Main()要领完毕了,应用顺序依然事激活的,直到一切前台线程完成任务。
能够经由过程设置Thread类实例的IsBackground属性,来让其成为背景线程;
public void Main() { Thread vThread = new Thread(() =>{ Console.WriteLine("New thread started"); // Title3Thread.Sleep(5000); Console.WriteLine("New thread completed"); // Title2});//vThread.IsBackground = true; vThread.Start(); Console.WriteLine("This is the main thread"); // Title1}
当IsBackground属性默许为false时,能够在掌握台完整地看到 3 句输出信息;但假如将其设为true时,则不比及第3条信息(Title2)输出时,主线程Main()已实行完成,掌握台窗口就自动封闭了。
4.线程的优先级
经由过程Priority属性,能够调解Thread类实例的优先级,默许为: vThread.Priority = ThreadPriority.Normal; // 罗列值
关联:Highest > AboveNormal > Normal > BelowNormal > Lowest
5.掌握线程
挪用Thread对象的Start()要领,能够建立线程。然则,在挪用Start()要领后,新线程仍不是处于 Running 状况,而是 Unstarted 状况。只要操作系统的线程调理器挑选了要运转该线程,线程就会改成 Running 状况。经由过程 Thread.ThreadState 属性,能够获得该线程当前的状况。
运用Thread.Sleep()要领,会使线程处于WaitSleepJoin状况,在阅历Sleep()要领定义的时间段后,线程就会守候再次被操作系统调理。
要住手一个线程,能够挪用 Thread.Abort() 要领。挪用这个要领,会在接到停止敕令的线程中抛出一个 ThreadAbortException,用一个处置惩罚顺序捕捉这个非常,线程能够在完毕前完成一些清算事情。线程还能够在接收到挪用 Thread.Abort() 要领的效果 ThreadAbortException 非常后继承事情。假如线程没有重置停止,接收到停止要求的线程的状况就从 AbortRequested 改成 Aborted 。
假如要守候线程完毕,就能够挪用 Thread.Join() 要领,它会住手当前线程,并把它设置为 WaitSleepJoin 状况,直到到场的线程完成为止。
拜见:
[]
以上就是C#中多线程之Thread类详解的细致内容,更多请关注ki4网别的相干文章!