C#開啟線程的幾種方式


方式一:通過委托發起線程(BeginInvoke):

Func<int, int> a = Test;
IAsyncResult ar = a.BeginInvoke(20, OnCallBack, a);//倒數第二個參數是一個委托類型的參數,表示回調函數,當線程結束時會調用這個委托指向的方法;倒數第一個參數用來給回調函數傳遞數據;通過ar獲取數據a

方式二:通過Thread發起線程,thread創建的線程都是前台線程,線程池創建的線程都是后台線程

1. thread參數為靜態方法

        static void Downloadfile()
        {
            Console.WriteLine("開始下載" + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
            Console.WriteLine("下載完成");
        }

        static void Main(string[] args)
        {
            Thread t = new Thread(Downloadfile);
            t.Start();
            Console.WriteLine("main");
            Console.ReadKey();
        }

2. lamda表達式

1 Thread t = new Thread(() =>
2     {
3         Console.WriteLine("開始下載" + Thread.CurrentThread.ManagedThreadId);
4         Thread.Sleep(2000);
5         Console.WriteLine("下載完成");
6     });
7 t.Start();    

3. Thread參數為普通方法

 1     class Program
 2     {
 3         static void Downloadfile(object filename)
 4         {
 5             Console.WriteLine("開始下載" + filename+ Thread.CurrentThread.ManagedThreadId);
 6             Thread.Sleep(2000);
 7             Console.WriteLine("下載完成"+filename);
 8         }
 9 
10         static void Main(string[] args)
11         {
12             //Thread t = new Thread(() =>
13             //{
14 
15             //    Console.WriteLine("開始下載" + Thread.CurrentThread.ManagedThreadId);
16             //    Thread.Sleep(2000);
17             //    Console.WriteLine("下載完成");
18             //});
19             //Thread t = new Thread(Downloadfile);
20             MyThread my = new MyThread("xxx.bt", "http://www.xxx.bbs");
21             Thread t = new Thread(my.DownFile);
22             t.Start();
23             Console.WriteLine("main");
24             Console.ReadKey();
25         }
26     }
View Code
 1     class MyThread
 2     {
 3         private string filename;
 4         private string filepath;
 5         public MyThread(string fileName, string filePath)
 6         {
 7             this.filename = fileName;
 8             this.filepath = filePath;
 9         }
10 
11         public void DownFile()
12         {
13             Console.WriteLine("開始下載" + filepath + filename);
14             Thread.Sleep(2000);
15             Console.WriteLine("下載完成");
16         }
17 
18     }
19 }
View Code

方式三:線程池:適合用於小任務線程,

WaitCallback:將方法排入隊列以便執行,WaitCallback,表示要執行的方法。如果將方法成功排入隊列,則為 true;否則為 false

 1     class Program
 2     {
 3         static void ThreadMethod(object state)
 4         {
 5             Console.WriteLine("線程開始"+Thread.CurrentThread.ManagedThreadId);
 6             Thread.Sleep(2000);
 7             Console.WriteLine("線程結束");
 8         }
 9         static void Main(string[] args)
10         {
11             ThreadPool.QueueUserWorkItem(ThreadMethod);
12             ThreadPool.QueueUserWorkItem(ThreadMethod);
13             ThreadPool.QueueUserWorkItem(ThreadMethod);
14             ThreadPool.QueueUserWorkItem(ThreadMethod);
15             ThreadPool.QueueUserWorkItem(ThreadMethod);
16             Console.ReadKey();
17         }
18     }
View Code

方式四:任務線程

1. 通過Task創建

 1 class Program
 2     {
 3         static void ThreadMethod()
 4         {
 5             Console.WriteLine("任務開始" + Thread.CurrentThread.ManagedThreadId);
 6             Thread.Sleep(2000);
 7             Console.WriteLine("任務結束");
 8         }
 9 
10         static void Main(string[] args)
11         {
12             Task t = new Task(ThreadMethod);
13             t.Start();
14             Console.WriteLine("main");
15             Console.ReadKey();
16         }
17     }
View Code

2. 通過TaskFactory創建

TaskFactory tf = new TaskFactory();
tf.StartNew(ThreadMethod);   

 tf.StartNew(ThreadMethod);
 tf.StartNew(ThreadMethod);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM