在c#中,對於不需要考慮嚴格時序的任務,線程是一個很方便的東西。
將沒一個單獨需要執行的事情都作為一個線程,在主函數中調用就可以了。
新建一個項目之后,需要引入線程相關的命名空間,里面包含了線程相關class的定義、功能函數等內容。
using System.Threading;
先定義一個thread類型的變量,其中th是該線程的名字,如果需要對該線程進行操作,就是對變量th的操作;ThreadMethod則是該線程所執行的函數。
Thread th = new Thread(ThreadMethod); //創建線程
線程函數內容如下,該函數是每隔500ms像控制台打印一次東西。
static void ThreadMethod()
{
while (true)
{
Console.Write("thread\r\n");
Thread.Sleep(500);
}
}
一邊用到線程的情況都是一個線程一直監聽並處理一些事情,所以會有一個while(true),即永不退出。
由於線程和主進程一樣,是一直在執行並且常駐內存的,(一般的子函數都是在堆棧中運行,調用的時候就在堆棧中臨時租借一塊地,函數執行完了再把那塊地兒還給你。而static關鍵字就是說,系統啊你要給我在內存里專門開一塊兒地方放置我的代碼塊,我以后可是你的固定客戶),所以線程函數也和主函數一樣,需要加static關鍵字,並且是 void 類型的。
當線程需要啟動時(假設你這個線程是統計景區人流量的,作為主管的你在家睡大覺,然后請一個零時工過來干貨):
th.Start(); //啟動線程
當線程需要掛起時(現在你親戚來了你給她開個后門直接放進去,這個時候就暫時不需要統計了),執行Suspend函數可以實現線程的掛起:
th.Suspend();//掛起線程
當線程需要繼續開始時(親戚都進去玩了),執行Resume函數可以實現線程的繼續運行:
th.Resume();//繼續線程
當線程需要停止時(下班了),執行Abort函數可以實現線程的中止:
th.Abort();//中止線程
整體代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace test
{
class Program
{
static void ThreadMethod()
{
while (true)
{
Console.Write("thread\r\n");
Thread.Sleep(500);
}
}
static void Main(string[] args)
{
Console.Write("main start\r\n");
Thread th = new Thread(ThreadMethod); //創建線程
th.Start(); //啟動線程
for (int i = 0; i < 10; i++)
{
if (i == 3) th.Suspend();
if (i == 5) th.Resume();
if (i == 7) th.Abort();
//if (i == 9) th.Resume(); /*異常:已引發: "線程目前未運行;無法使其繼續。*/
Console.Write(i + "\r\n");
Thread.Sleep(1000);
}
Console.Write("main end\r\n");
Console.ReadKey();
}
}
}
運行效果如下圖:
出處:https://blog.csdn.net/qq_27508477/article/details/87177332