C#多線程編程

1、線程分為前臺線程和后臺線程,應用程序在所有前臺線程結束后退出。

2、使用Thread創建前臺線程:

Thread t1 = new Thread(Function1);
t1.Start();
private static void Function1()
 {
     Thread.Sleep(1000);//模擬耗時操作,睡眠1s
     Console.WriteLine("前臺線程被調用!");
 }

3、使用Thread創建帶參數的后臺線程

Thread t2= new Thread(new ParameterizedThreadStart(Function2));
t2.IsBackground = true;//設置為后臺線程
t2.Start("傳參");
private static void Function2(object data)
 {
     Thread.Sleep(2000);//模擬耗時操作,睡眠2s
     Console.WriteLine("后臺線程被調用!" + data);
 }

4、使用ThreadPool創建后臺線程

Console.WriteLine("主線程開始!");
//創建要執行的任務
WaitCallback workItem = state => Console.WriteLine("當前線程Id為:" + Thread.CurrentThread.ManagedThreadId);
//重復調用10次
for (int i = 0; i < 10; i++)
{
    ThreadPool.QueueUserWorkItem(workItem);
}
Console.ReadLine();

5、并行For循環

ParallelLoopResult result = Parallel.For(0, 100, i => {
    Console.WriteLine("{0}, task: {1} , thread: {2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
});

6、啟動Task

  • 方式一:
Task.Factory.StartNew(() => Console.WriteLine("Task running."));
  • 方式二:
Task.Run(() => Console.WriteLine("Task running."));
  • 接收返回值的Task
Console.WriteLine("主線程ID:" + Thread.CurrentThread.ManagedThreadId);
Task<string> task = Task.Run(() =>
{
    return Thread.CurrentThread.ManagedThreadId.ToString();
});
Console.WriteLine("創建Task對應的線程ID:" + task.Result);
Console.ReadLine();

7、async/await異步編程

static void Main(string[] args)
{
    //主線程調用AsyncCaller方法,被async標記的方法將會在合適的時候異步執行
    var task = AsyncCaller();
    //主線程調用task.Result等待異步執行結果
    Console.WriteLine(task.Result);       //3
    Console.ReadKey();
}
private static async Task<string> AsyncCaller()
{
    //await標記了一個等待點
    var str = await AsyncFunction();      //2
    return str;
}
private static Task<string> AsyncFunction()
{
    //下面就是將要被異步執行的任務,主線程到這里就會返回
    return Task.Run(() =>           //1
    {
        return "AsyncFunction()執行完畢";
    });
}

主線程執行到1處后,函數AsyncFunction返回,接著AsyncCaller直接從2處返回,并執行到3處等待。異步線程執行完畢后,返回到2處,繼續向后執行,返回值傳遞給task.Result,異步線程結束。

參考資料

.Net異步編程知多少 圣杰

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • future頭文件 future頭文件提供了這樣一種便利,允許異步訪問一個被一個特定的提供者設置的值,提供者和訪問...
    EVANMORE閱讀 2,417評論 0 0
  • 本文主要講了java中多線程的使用方法、線程同步、線程數據傳遞、線程狀態及相應的一些線程函數用法、概述等。 首先講...
    李欣陽閱讀 2,503評論 1 15
  • Java多線程學習 [-] 一擴展javalangThread類 二實現javalangRunnable接口 三T...
    影馳閱讀 2,987評論 1 18
  • NSThread 第一種:通過NSThread的對象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 854評論 0 3
  • 要說第二次拔牙,得先從第一次說起。 第一次 大概是在我八歲剛換完乳牙長出新牙的時候,當時有一顆長得...
    文能武閱讀 333評論 2 2