.NET 多線程:精通 CSharp 並行編程
線程基礎 (Threading Basics)
在本章中,我們將介紹在 CSharp 中進行線程操作的基本任務。您將學習到以下內容:
- 在 CSharp 中創建一個線程
- 暫停一個線程
- 使一個線程等待
- 終止一個線程
- 確定線程狀態
- 線程優先級
- 前景和背景線程
- 向線程傳遞參數
- 使用 CSharp lock 關鍵字鎖定
- 使用 Monitor 結構鎖定
- 處理異常
在本章中,我們將介紹在 CSharp 中進行線程操作的基本任務。您將學習到以下內容:
歡迎大家!來深入探討一下C#的多執行緒(Thread)程式的精彩世界吧。今天,我們會探討Task.Run,了解Task Factory StartNew,並運用異步(Asynchronous)任務的強大功能。
Continue...int[] nums = Enumerable.Range(0, 100).ToArray();
Parallel.For(0, nums.Length, i =>
{
// 這裡的程式會並行執行
nums[i] = nums[i] * nums[i];
});
public async Task<int> CalculateResultAsync()
{
// 啟動一個新的任務
var task = Task.Run(() =>
{
int sum = 0;
for (int i = 0; i < 1000; i++)
{
sum += i;
}
return sum;
});
// 等待任務完成並返回結果
return await task;
}
void ThreadMethod()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("ThreadProc: {0}", i);
// 使線程睡眠一秒
Thread.Sleep(1000);
}
}
Thread t = new Thread(new ThreadStart(ThreadMethod));
// 啟動線程
t.Start();
在選擇這些技術時,重要的是要了解您的應用程式的需求和限制,以選擇最適合您場景的方法。例如,對於計算密集型任務,Parallel 和多線程可能更有效,而對於 I/O 繫結或需要非同步操作的任務,Task 則可能是更好的選擇。
Continue...在 Red Hat Linux 或其他基於 Linux 的系統中開發服務程式時,一個有效的方法是使用 C# 與 .NET Core,並通過 systemd 服務單元進行管理。
首先,建立一個 C# 控制台應用程式,這將作為服務運行。例如,建立一個簡單的 HelloService.cs
,其內容大致如下:
在JavaScript中,map函數用於轉換陣列中的每個元素並返回一個新陣列。在C#中,可以使用IEnumerable
在Linux系統中,可以通過讀取 /proc/loadavg
文件來獲得CPU的平均負載。這個檔案提供了過去1分鐘、5分鐘和15分鐘的平均負載數據。以下是在.NET環境中如何讀取這些數據的範例。
最近在移植 CSharp .NET Framework 到 .NET 6 並且在 Linux 上呼叫批次程式時,遇到一個難題那就是沒辦法更換身分。要如何讓.NET在Linux 上轉換身分執行程式,這時候就只能改寫既有程式,以符合Linux規則。
Continue...為了保護.NET Framework應用程式中的敏感設置,如連接字符串和應用設置,您可以使用PowerShell加密app.config文件。以下是具體的操作步驟:
Continue...Regex regex = new Regex(@"\b((virtual|static|inline|__forceinline|__inline|__inline__)*\s+)*([\w<>_]+\s+[*&]*\s*)([\w_]+)\s*\((.*?)\)\s*({?)", RegexOptions.Multiline);
以下是正則表達式的簡要說明:
\b:匹配一個單詞邊界 ((virtual|static|inline|__forceinline|_inline|inline)\s+):匹配列出的關鍵字(virtual、static、inline、__forceinline、__inline、inline)和空格字符(如空格或制表符)的任意組合。 ([\w<>_]+\s+[&]\s):匹配函數的返回類型,可以包括模板參數以及返回類型的指針或引用。 ([\w]+):匹配函數名。 \s*((.?))\s:匹配括號內的參數列表,包括括號前後的任何空格字符。.*?以非貪婪的方式匹配任何字符,因此它會在遇到第一個閉括號時停止匹配。 ({?):匹配函數體的左大括號,如果有的話。 請注意,此正則表達式假設源程式文件格式良好,沒有任何語法錯誤。它也不能處理所有可能的 C/C++ 函數定義變體,例如使用函數指針或變長參數的函數定義。
Continue...