{
"cells": [
"attachments": {},
"cell_type": "markdown",
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
}
"source": [
"托管线程(Thread) 使用\n",
"============================== "
]
"学习 Thread,执行各种 Thread 操作。<br/>\n",
"特别注意:NoteBook 本身的运行线程是后台线程,不会等待由其创建的线程执行结束。与控制台等应用有区别。"
"## 执行环境"
"cell_type": "code",
"execution_count": 4,
"vscode": {
"languageId": "polyglot-notebook"
"outputs": [
"data": {
"text/html": [
"<table><tbody><tr><td><img src=\"data:image/png;base64, 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
"metadata": {},
"output_type": "display_data"
],
"#!about"
"## 全局设置,语言设置、Nuget包引用、空间引用等"
"execution_count": 5,
"outputs": [],
"//全局设置\n",
"#!csharp\n",
"using System.Threading;\n",
"using System.Threading.Channels;\n",
"using System.Threading.Tasks;\n",
"\n",
"//全局变量\n",
"var noteBookThreadDesc = \"NoteBook线程\";\n",
"//全局方法\n",
"//显示线程信息\n",
"public void ShowThreadInfo(Thread showThread=null, string describe = null)\n",
"{\n",
" if(showThread == null)\n",
" {\n",
" showThread = Thread.CurrentThread;\n",
" }\n",
" if(string.IsNullOrWhiteSpace(describe))\n",
" describe = showThread.Name == null ? \"无名\" : showThread.Name;\n",
" Console.WriteLine($\"{describe}线程ID:{showThread.ManagedThreadId} \");\n",
" Console.WriteLine($\"{describe}线程名:{showThread.Name} \");\n",
" Console.WriteLine($\"{describe}线程状态:{showThread.ThreadState} \");\n",
" Console.WriteLine($\"{describe}线程模式:{showThread.GetApartmentState()} \");\n",
" Console.WriteLine($\"{describe}激活:{(showThread.IsAlive ? \"活动\" : \"非活动\")} \");\n",
" Console.WriteLine($\"{describe}线程池线程:{(showThread.IsThreadPoolThread ? \"是的\" : \"否\")} \");\n",
" Console.WriteLine($\"{describe}后台线:{(showThread.IsBackground ? \"是的\" : \"不是\")} \");\n",
" Console.WriteLine($\"{describe}区域:{showThread.CurrentCulture}\");\n",
" Console.WriteLine($\"{describe}UI区域:{showThread.CurrentUICulture}\");\n",
" Console.WriteLine($\"{describe}优先级:{showThread.Priority}\");\n",
"}\n",
"//显示线程状态\n",
"public void ShowThreadState(Thread showThread=null, string describe = null)\n",
"}"
"## 显示 Jupter Notebook (Kernel) 运行线程信息\n",
"注意:NoteBook 本身的运行线程是后台线程,不会等待由其创建的线程执行结束,这点与控制台等应用有区别。"
"execution_count": 6,
"name": "stdout",
"output_type": "stream",
"text": [
"NoteBook线程ID:6 \n",
"NoteBook线程名:.NET ThreadPool Worker \n",
"NoteBook线程状态:Background \n",
"NoteBook线程模式:MTA \n",
"NoteBook激活:活动 \n",
"NoteBook线程池线程:是的 \n",
"NoteBook后台线:是的 \n",
"NoteBook区域:zh-CN\n",
"NoteBookUI区域:zh-CN\n",
"NoteBook优先级:Normal\n"
"ShowThreadInfo(null, \"NoteBook\");"
"## 使用托管线程\n",
"注意:NoteBook 本身的运行线程是后台线程,不会等待由其创建的线程执行结束,这点与控制台等应用有区别。 "
"### 启动新线程:无参"
"execution_count": 7,
"ename": "Error",
"evalue": "(14,25): error CS0103: 当前上下文中不存在名称“desc”",
"output_type": "error",
"traceback": [
"(14,25): error CS0103: 当前上下文中不存在名称“desc”"
"ThreadStart start = ()=>\n",
" Console.WriteLine($\"线程:{Thread.CurrentThread.Name},已经执行!\");\n",
"};\n",
"var t = new Thread(start)\n",
" Name = \"新线程\"\n",
"t.Start();\n",
"//如果不join,新创建的线程,可能还没来得及执行,就随着Notebook线程的结束而结束了。\n",
"t.Join();\n",
"Console.WriteLine($\"线程:{desc}, 执行结束!\");\n"
"### 启动新线程:有参"
"execution_count": 8,
"线程:新有参数线程,参数为 我是参数!\n",
"线程:新有参数线程,已经执行!\n",
"线程:NoteBook线程, 执行结束!\n"
"ParameterizedThreadStart pStart = para=>\n",
" Console.WriteLine($\"线程:{Thread.CurrentThread.Name},参数为 {para}!\");\n",
"var thread_para = new Thread(pStart)\n",
" Name=\"新有参数线程\"\n",
"thread_para.Start(\"我是参数\");\n",
"thread_para.Join();\n",
"Console.WriteLine($\"线程:{noteBookThreadDesc}, 执行结束!\");"
"### 等待线程完成"
"execution_count": 9,
"主线程,开始执行!\n",
"等待新线程执行完成...\n",
"新线程开始执行!\n",
"新线程执行完成!\n",
"主线程执行结束!\n"
"Console.WriteLine(\"主线程,开始执行!\");\n",
"var thread_join = new Thread(()=>\n",
" Console.WriteLine(\"新线程开始执行!\");\n",
" Thread.Sleep(200);\n",
" Console.WriteLine(\"新线程执行完成!\");\n",
"});\n",
"thread_join.Start();\n",
"Console.WriteLine(\"等待新线程执行完成...\");\n",
"thread_join.Join();\n",
"Console.WriteLine(\"主线程执行结束!\");"
"### 前台线与后台线程"
"程序启动的线程一般称为主线程或UI线程,大部分为前台线程;只有单元测试和Notebook等为后台线程。"
"execution_count": 10,
"主线程开始,为后台线程\n",
"新线程开始,为前台线程\n",
"主线程结束\n"
"//主线程\n",
"Console.WriteLine($\"主线程开始,为{(Thread.CurrentThread.IsBackground ? \"后台\" : \"前台\")}线程\");\n",
"var thread_isbackground = new Thread(()=>\n",
" Console.WriteLine($\"新线程开始,为{(Thread.CurrentThread.IsBackground ? \"后台\" : \"前台\")}线程\");\n",
" Thread.Sleep(1000);\n",
" Console.WriteLine($\"新线程执行完成!\");\n",
"thread_isbackground.IsBackground = false;\n",
"thread_isbackground.Start();\n",
"thread_isbackground.Join();\n",
"Console.WriteLine($\"主线程结束\");\n"
"### 线程中断与恢复"
".Net Core 平台不支持线程 Abort() 和 Resume()方法,推荐使用其它方法"
"execution_count": 11,
"中止新线程异常:Thread abort is not supported on this platform.\n",
"恢复新线程异常:Thread suspend is not supported on this platform.\n",
"新线程完成!\n",
"var thread_abort = new Thread(()=>\n",
" Thread.Sleep(500);\n",
" Console.WriteLine($\"新线程完成!\");\n",
"thread_abort.Start();\n",
"Thread.Sleep(100);\n",
"//Abort在.net core平台不支持,会抛出异常\n",
"try\n",
" thread_abort.Abort();\n",
"//处理异常后,继续执行\n",
"catch(Exception e)\n",
" Console.WriteLine(\"中止新线程异常:\" + e.Message);\n",
"//Resume 在.net core平台不支持,会抛出异常\n",
" thread_abort.Resume();\n",
" Console.WriteLine(\"恢复新线程异常:\" + e.Message);\n",
"//等待新线程执行完成\n",
"thread_abort.Join();\n",
"Console.WriteLine($\"主线程结束\");"
"### 线程状态及转换"
"attachments": {
"LifeCycle.png": {
"image/png": "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
"线程从创建到执行到结束,要经过很多状态。也就是线程的生命周期。 \n",
"]"
"#### 线程各种状态说明"
"execution_count": 12,
"Running\n",
"StopRequested\n",
"SuspendRequested\n",
"Background\n",
"Unstarted\n",
"Stopped\n",
"WaitSleepJoin\n",
"Suspended\n",
"AbortRequested\n",
"Aborted\n"
"//线程各状态与说明\n",
"[Flags]\n",
"public enum ThreadState\n",
" // 运行中:线程已启动但尚未停止\n",
" Running = 0,\n",
" // 正在请求线程停止,这种仅在内部使用\n",
" StopRequested = 1,\n",
" // 正在请求线程挂起\n",
" SuspendRequested = 2,\n",
" // 该线程作为后台线程执行,而不是前台线程。此状态通过设置 System.Thread.Thread.IsBackground 属性来控制\n",
" Background = 4,\n",
" // 启动前:尚未在线程上调用System.Thread.Thread.Start方法\n",
" Unstarted = 8,\n",
" // 线程已停止\n",
" Stopped = 16,\n",
" // 线程被阻塞状态,可能的原因\n",
" // * 线程休眠:调用了 Thread.Sleep() 方法\n",
" // * 线程等待:调用了 Tthread.Join() 方法\n",
" // * 请求锁定:通过调用 Monitor.Enter()方法 或 Monitor.Wait() 方法\n",
" // * 等待线程同步对象(例如:System.Thread.ManualResetEvent)的结果\n",
" // * 其它内部机制\n",
" WaitSleepJoin = 32,\n",
" // 线程已挂起\n",
" Suspended = 64,\n",
" // 已在线程上调用 Abort 方法,但线程尚未收到抛出的挂起异常时间的状态\n",
" AbortRequested = 128,\n",
" // 线程状态包括AbortRequested,并且线程现在已停止,但其状态尚未更改为Stop\n",
" Aborted = 256\n",
"foreach(var a in System.Enum.GetNames<ThreadState>())\n",
" Console.WriteLine(a);\n",
"#### 普通执行流程"
"未开始[Unstarted] => 运行中[Running] => 阻塞状态[WaitSleepJoin] => 恢复执行[Running] => 停止[Stopped]"
"execution_count": 13,
"主线程开始!\n",
"新线程: 未启动时状态为 Unstarted\n",
"新线程: 启动后的状态为 Running\n",
"新线程状态:Running => WaitSleepJoin\n",
"新线程状态:WaitSleepJoin => Running\n",
"新线程:Join后的状态为 Stopped\n",
"主线程结束!\n"
"Console.WriteLine($\"主线程开始!\");\n",
"var stateThread_1 = new Thread(()=>\n",
" //Console.WriteLine($\"新线程开始,状态为{Thread.CurrentThread.ThreadState}\");\n",
" for(int i=0;i<1000000;i++)\n",
" var result = Math.BigMul(7897987,456464565)+Math.Pow(4646.2343,4646.33);\n",
" //Console.WriteLine($\"新线程完成!\");\n",
"//未启动线程\n",
"Console.WriteLine($\"新线程: 未启动时状态为 {stateThread_1.ThreadState}\");\n",
"//启动线程\n",
"stateThread_1.Start();\n",
"Console.WriteLine($\"新线程: 启动后的状态为 {stateThread_1.ThreadState}\");\n",
"//主线程循环检测新线程状态\n",
"var preState1 = stateThread_1.ThreadState;\n",
"while(true)\n",
" if(!stateThread_1.IsAlive) break;\n",
" if(preState1 != stateThread_1.ThreadState)\n",
" Console.WriteLine($\"新线程状态:{preState1} => {stateThread_1.ThreadState}\");\n",
" preState1 = stateThread_1.ThreadState;\n",
"//主线程等待新线程结束\n",
"if(Thread.CurrentThread.IsBackground)\n",
" stateThread_1.Join();\n",
"//执行完成状态\n",
"Console.WriteLine($\"新线程:Join后的状态为 {stateThread_1.ThreadState}\");\n",
"Console.WriteLine($\"主线程结束!\");"
"#### 后台线程普通流程"
"未开始[Unstarted] => 后台运行中[Background] => 后台与阻塞状态[Background,WaitSleepJoin] => 恢复后台执行[Background] => 停止[Stopped]"
"execution_count": 14,
"新线程: 未启动时状态为 Background, Unstarted\n",
"新线程: 启动后的状态为 Background\n",
"新线程状态:Background => Background, WaitSleepJoin\n",
"新线程状态:Background, WaitSleepJoin => Background\n",
"var stateThread_2 = new Thread(() =>\n",
" for (int i = 0; i < 1000000; i++)\n",
" var result = Math.BigMul(7897987, 456464565) + Math.Pow(4646.2343, 4646.33);\n",
"stateThread_2.IsBackground=true;\n",
"Console.WriteLine($\"新线程: 未启动时状态为 {stateThread_2.ThreadState}\");\n",
"stateThread_2.Start();\n",
"Console.WriteLine($\"新线程: 启动后的状态为 {stateThread_2.ThreadState}\");\n",
"var preState1 = stateThread_2.ThreadState;\n",
"while (true)\n",
" if (!stateThread_2.IsAlive) break;\n",
" if (preState1 != stateThread_2.ThreadState)\n",
" Console.WriteLine($\"新线程状态:{preState1} => {stateThread_2.ThreadState}\");\n",
" preState1 = stateThread_2.ThreadState;\n",
"stateThread_2.Join();\n",
"Console.WriteLine($\"新线程:Join后的状态为 {stateThread_2.ThreadState}\");\n",
"### 是否线程池线程"
"Thread 类管理的线程,均为非线程池线程。 \n",
"注意:Notebook执行线程是线程池线程。"
"execution_count": 16,
"主线程开始,为线程池线程\n",
"主线程结束!\n",
"新线程开始,为非线程池线程\n",
"新线程完成!\n"
"Console.WriteLine($\"主线程开始,为{(Thread.CurrentThread.IsThreadPoolThread ? \"线程池\" : \"非线程池\")}线程\");\n",
"var thread_isPoolThread = new Thread(()=>\n",
" Console.WriteLine($\"新线程开始,为{(Thread.CurrentThread.IsThreadPoolThread ? \"线程池\" : \"非线程池\")}线程\");\n",
"thread_isPoolThread.Start();\n",
"if(thread_isPoolThread.IsBackground)\n",
" thread_isPoolThread.Join();\n",
"Console.WriteLine($\"主线程结束!\");"
"kernelspec": {
"display_name": ".NET (C#)",
"language": "C#",
"name": ".net-csharp"
"kernelInfo": {
"defaultKernelName": "csharp",
"items": [
"aliases": [
"c#",
"C#"
"languageName": "C#",
"name": "csharp"
"frontend"
"languageName": null,
"name": "vscode"
"aliases": [],
"name": ".NET"
"f#",
"F#"
"languageName": "F#",
"name": "fsharp"
"languageName": "HTML",
"name": "html"
"js"
"languageName": "JavaScript",
"name": "javascript"
"languageName": "KQL",
"name": "kql"
"languageName": "Mermaid",
"name": "mermaid"
"powershell"
"languageName": "PowerShell",
"name": "pwsh"
"languageName": "SQL",
"name": "sql"
"name": "value"
"name": "webview"
"nbformat": 4,
"nbformat_minor": 2