|
|
@ -25,14 +25,6 @@
|
|
|
|
"+ 综合使用"
|
|
|
|
"+ 综合使用"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
|
|
|
|
"attachments": {},
|
|
|
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
|
|
|
"metadata": {},
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"## 全局设置,语言设置、Nuget包引用、空间引用等"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
@ -49,6 +41,9 @@
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"polyglot_notebook": {
|
|
|
|
"polyglot_notebook": {
|
|
|
|
"kernelName": "csharp"
|
|
|
|
"kernelName": "csharp"
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"vscode": {
|
|
|
|
|
|
|
|
"languageId": "polyglot-notebook"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"outputs": [],
|
|
|
|
"outputs": [],
|
|
|
@ -104,6 +99,31 @@
|
|
|
|
"}"
|
|
|
|
"}"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"attachments": {},
|
|
|
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
|
|
|
"metadata": {},
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"## .Net中的原子操作类"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"attachments": {},
|
|
|
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
|
|
|
"metadata": {},
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
".Net中, System.Threading.Interlocked 类提供了用于执行原子操作的函数,这些函数接收引用参数(ref),也就是变量内存地址,然后针对该内存地址的值执行原子操作。"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"attachments": {},
|
|
|
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
|
|
|
"metadata": {},
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"### Increment\n",
|
|
|
|
|
|
|
|
"Interlocked.Increment 函数执行的原子操作属于 “获取-添加”分类,执行后变量的值增加1,返回的值是增加后的值,即增加前的值加1"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
|
|
|
"cell_type": "code",
|
|
|
|
"execution_count": null,
|
|
|
|
"execution_count": null,
|
|
|
@ -113,59 +133,50 @@
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"polyglot_notebook": {
|
|
|
|
"polyglot_notebook": {
|
|
|
|
"kernelName": "csharp"
|
|
|
|
"kernelName": "csharp"
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"vscode": {
|
|
|
|
|
|
|
|
"languageId": "polyglot-notebook"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"outputs": [],
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
"//全局设置\n",
|
|
|
|
"//计数器类\n",
|
|
|
|
"#!csharp\n",
|
|
|
|
"public class Counter\n",
|
|
|
|
"using System.Threading;\n",
|
|
|
|
|
|
|
|
"using System.Threading.Channels;\n",
|
|
|
|
|
|
|
|
"using System.Threading.Tasks;\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
"//全局变量\n",
|
|
|
|
|
|
|
|
"var noteBookThreadDesc = \"NoteBook线程\";\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
"//全局方法\n",
|
|
|
|
|
|
|
|
"//显示线程信息\n",
|
|
|
|
|
|
|
|
"public void ShowThreadInfo(Thread showThread=null, string describe = null)\n",
|
|
|
|
|
|
|
|
"{\n",
|
|
|
|
"{\n",
|
|
|
|
" if(showThread == null)\n",
|
|
|
|
" //总次数\n",
|
|
|
|
" {\n",
|
|
|
|
" public static int TotalNumber = 0;\n",
|
|
|
|
" showThread = Thread.CurrentThread;\n",
|
|
|
|
" \n",
|
|
|
|
" }\n",
|
|
|
|
" //方法循环次数\n",
|
|
|
|
|
|
|
|
" public static readonly int LoopNumber = 100;\n",
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
|
" if(string.IsNullOrWhiteSpace(describe))\n",
|
|
|
|
" //执行\n",
|
|
|
|
|
|
|
|
" public static void Execute()\n",
|
|
|
|
" {\n",
|
|
|
|
" {\n",
|
|
|
|
" describe = showThread.Name == null ? \"无名\" : showThread.Name;\n",
|
|
|
|
" for (int i = 1; i <= LoopNumber; i++)\n",
|
|
|
|
|
|
|
|
" {\n",
|
|
|
|
|
|
|
|
" //原子操作\n",
|
|
|
|
|
|
|
|
" System.Threading.Interlocked.Increment(ref TotalNumber);\n",
|
|
|
|
|
|
|
|
" }\n",
|
|
|
|
|
|
|
|
" Console.WriteLine($\"线程[{Thread.CurrentThread.ManagedThreadId.ToString(\"000\")}] 执行了累加 {LoopNumber} 次,结束时 TotalNumber = {TotalNumber}\");\n",
|
|
|
|
" }\n",
|
|
|
|
" }\n",
|
|
|
|
"\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",
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
|
"//显示线程状态\n",
|
|
|
|
"//使用域隔离和代码折叠\n",
|
|
|
|
"public void ShowThreadState(Thread showThread=null, string describe = null)\n",
|
|
|
|
|
|
|
|
"{\n",
|
|
|
|
"{\n",
|
|
|
|
" if(showThread == null)\n",
|
|
|
|
" var threads = new List<Thread>()\n",
|
|
|
|
" {\n",
|
|
|
|
" {\n",
|
|
|
|
" showThread = Thread.CurrentThread;\n",
|
|
|
|
" new Thread(Counter.Execute){Name=\"thread_a\"},\n",
|
|
|
|
" }\n",
|
|
|
|
" new Thread(Counter.Execute){Name=\"thread_b\"}\n",
|
|
|
|
|
|
|
|
" };\n",
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
|
" if(string.IsNullOrWhiteSpace(describe))\n",
|
|
|
|
" threads.ForEach(t => t.Start());\n",
|
|
|
|
" {\n",
|
|
|
|
" threads.ForEach(t => t.Join());\n",
|
|
|
|
" describe = showThread.Name == null ? \"无名\" : showThread.Name;\n",
|
|
|
|
"\n",
|
|
|
|
" }\n",
|
|
|
|
" //主线程信息\n",
|
|
|
|
" Console.WriteLine($\"{describe}线程状态:{showThread.ThreadState} \");\n",
|
|
|
|
" Console.WriteLine($\"主(执行)线程[{Thread.CurrentThread.ManagedThreadId.ToString(\"000\")}] 结束时,TotalLoopNumber = {Counter.TotalNumber}\");\n",
|
|
|
|
"}"
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
"//原子操作,多线程下多次执行结果相同"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
],
|
|
|
|
],
|
|
|
@ -176,7 +187,11 @@
|
|
|
|
"name": ".net-csharp"
|
|
|
|
"name": ".net-csharp"
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"language_info": {
|
|
|
|
"language_info": {
|
|
|
|
"name": "polyglot-notebook"
|
|
|
|
"file_extension": ".cs",
|
|
|
|
|
|
|
|
"mimetype": "text/x-csharp",
|
|
|
|
|
|
|
|
"name": "C#",
|
|
|
|
|
|
|
|
"pygments_lexer": "csharp",
|
|
|
|
|
|
|
|
"version": "11.0"
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"polyglot_notebook": {
|
|
|
|
"polyglot_notebook": {
|
|
|
|
"kernelInfo": {
|
|
|
|
"kernelInfo": {
|
|
|
|