成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Winform中C#線程控制的四種常見情況分析

開發 后端
C#線程控制有四種常見情況:啟動,通訊,終止以及異常處理。本文總結了一些有關這四種情況的處理建議。

Winform界面中,將事務放在新開的線程中操作是十分有用的做法,因為這樣可以增加用戶體驗,減少耗時。對這些C#線程的控制,常常有下面這四種情況:

1. 啟動線程;

2. 線程間通訊;

3. 線程終止;

4. 線程中的異常處理;

下面總結一些上面這些C#線程操作的常用方法。

C#線程控制1. 啟動C#線程

◆如果是需要很頻繁的開線程,會使用線程池(微軟的或自己寫的)

◆Thread.Start(參數object);

◆或者用對象提供的BeginXXXX()這種都是異步,也算多線程啟動.

C#線程控制2. C#線程間通訊

◆委托,事件這些比較常用,并且對object的多線程處理需要謹慎,可能用到lock(object){}.

◆主要是通過線程同步或者回調方法(或者說是委托)來實現

C#線程控制3. 線程終止

◆線程的終止,用事件AUTORESET之類

◆可以用Thread.ManualEvent().Reset()/Set()/WaitOne()方法來判斷和等待

C#線程控制4. 線程中的異常處理

◆線程中的異常通過事件傳回到主線程處理

◆還是寫log吧,多線程debug比較難,還是逐步log比較好.

用于C#線程通訊的lock關鍵字

下面的示例演示使用 lock 關鍵字以及 AutoResetEvent 和 ManualResetEvent 類對主線程和兩個輔助線程進行線程同步。

該示例創建兩個輔助線程。一個線程生成元素并將它們存儲在非線程安全的泛型隊列中。有關更多信息,請參見 Queue。另一個線程使用此隊列中的項。另外,主線程定期顯示隊列的內容,因此該隊列被三個線程訪問。lock 關鍵字用于同步對隊列的訪問,以確保隊列的狀態沒有被破壞。

除了用 lock 關鍵字來阻止同時訪問外,還用兩個事件對象提供進一步的同步。一個事件對象用來通知輔助線程終止,另一個事件對象由制造者線程用來在有新項添加到隊列中時通知使用者線程。這兩個事件對象封裝在一個名為 SyncEvents 的類中。這使事件可以輕松傳遞到表示制造者線程和使用者線程的對象。SyncEvents 類是按如下方式定義的:

C# code

  1. using System;   
  2. using System.Threading;   
  3. using System.Collections;   
  4. using System.Collections.Generic;   
  5.  
  6. public class SyncEvents   
  7. {   
  8. public SyncEvents()   
  9. {   
  10.  
  11. _newItemEvent = new AutoResetEvent(false);   
  12. _exitThreadEvent = new ManualResetEvent(false);   
  13. _eventArray = new WaitHandle[2];   
  14. _eventArray[0] = _newItemEvent;   
  15. _eventArray[1] = _exitThreadEvent;   
  16. }   
  17.  
  18. public EventWaitHandle ExitThreadEvent   
  19. {   
  20. get { return _exitThreadEvent; }   
  21. }   
  22. public EventWaitHandle NewItemEvent   
  23. {   
  24. get { return _newItemEvent; }   
  25. }   
  26. public WaitHandle[] EventArray   
  27. {   
  28. get { return _eventArray; }   
  29. }   
  30.  
  31. private EventWaitHandle _newItemEvent;   
  32. private EventWaitHandle _exitThreadEvent;   
  33. private WaitHandle[] _eventArray;   
  34. }   
  35. public class Producer   
  36. {   
  37. public Producer(Queue <int> q, SyncEvents e)   
  38. {   
  39. _queue = q;   
  40. _syncEvents = e;   
  41. }   
  42. // Producer.ThreadRun   
  43. public void ThreadRun()   
  44. {   
  45. int count = 0;   
  46. Random r = new Random();   
  47. while (!_syncEvents.ExitThreadEvent.WaitOne(0, false))   
  48. {   
  49. lock (((ICollection)_queue).SyncRoot)   
  50. {   
  51. while (_queue.Count < 20)   
  52. {   
  53. _queue.Enqueue(r.Next(0,100));   
  54. _syncEvents.NewItemEvent.Set();   
  55. count++;   
  56. }   
  57. }   
  58. }   
  59. Console.WriteLine("Producer thread: produced {0} items", count);   
  60. }   
  61. private Queue <int> _queue;   
  62. private SyncEvents _syncEvents;   
  63. }   
  64.  
  65. public class Consumer   
  66. {   
  67. public Consumer(Queue <int> q, SyncEvents e)   
  68. {   
  69. _queue = q;   
  70. _syncEvents = e;   
  71. }   
  72. // Consumer.ThreadRun   
  73. public void ThreadRun()   
  74. {   
  75. int count = 0;   
  76. while (WaitHandle.WaitAny(_syncEvents.EventArray) != 1)   
  77. {   
  78. lock (((ICollection)_queue).SyncRoot)   
  79. {   
  80. int item = _queue.Dequeue();   
  81. }   
  82. count++;   
  83. }   
  84. Console.WriteLine("Consumer Thread: consumed {0} items", count);   
  85. }   
  86. private Queue <int> _queue;   
  87. private SyncEvents _syncEvents;   
  88. }   
  89.  
  90. public class ThreadSyncSample   
  91. {   
  92. private static void ShowQueueContents(Queue <int> q)   
  93. {   
  94. lock (((ICollection)q).SyncRoot)   
  95. {   
  96. foreach (int item in q)   
  97. {   
  98. Console.Write("{0} ", item);   
  99. }   
  100. }   
  101. Console.WriteLine();   
  102. }   
  103.  
  104. static void Main()   
  105. {   
  106. Queue <int> queue = new Queue <int>();   
  107. SyncEvents syncEvents = new SyncEvents();   
  108.  
  109. Console.WriteLine("Configuring worker threads...");   
  110. Producer producer = new Producer(queue, syncEvents);   
  111. Consumer consumer = new Consumer(queue, syncEvents);   
  112. Thread producerThread = new Thread(producer.ThreadRun);   
  113. Thread consumerThread = new Thread(consumer.ThreadRun);   
  114.  
  115. Console.WriteLine("Launching producer and consumer threads...");  
  116. producerThread.Start();   
  117. consumerThread.Start();   
  118.  
  119. for (int i=0; i <4; i++)   
  120. {   
  121. Thread.Sleep(2500);   
  122. ShowQueueContents(queue);   
  123. }   
  124.  
  125. Console.WriteLine("Signaling threads to terminate...");   
  126. syncEvents.ExitThreadEvent.Set();   
  127.  
  128. producerThread.Join();   
  129. consumerThread.Join();   
  130. }   
  131.  
  132. }  
  133.  

【編輯推薦】

  1. C#子線程的控件操作問題解析
  2. C#線程相關問題總結:基本操作及UI控件交互
  3. 學習C#多線程:lock的用法
  4. 總結C#多線程的點點滴滴
  5. 學習C#實現HTTP協議:多線程文件傳輸
責任編輯:yangsai 來源: CSDN論壇
相關推薦

2024-10-24 08:04:00

2009-08-28 16:51:32

C#線程控制

2009-08-26 15:04:35

C#轉換

2009-08-20 09:52:31

C#參數類型

2011-11-24 16:34:39

Java

2009-08-05 14:09:04

C#日期轉換

2024-05-29 13:18:12

線程Thread?方式

2009-09-08 17:20:01

C#排序算法

2021-08-12 11:37:23

數據分析錯誤

2009-09-22 14:20:39

C#播放聲音

2009-09-17 16:55:58

C#組件設計

2023-10-30 11:40:36

OOM線程池單線程

2021-06-04 10:45:31

軟件架構分布式

2020-06-17 08:31:10

權限控制Spring Secu

2021-07-27 10:49:10

SpringSecurity權限

2024-06-24 01:00:00

2017-04-17 19:31:03

Android多線程

2009-08-17 16:56:51

C#多線程控制進度條

2020-11-10 10:08:41

Kubernetes容器開發

2020-06-24 07:49:13

Kubernetes場景網絡
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美综合精品另类天天更新 | 欧美日韩18 | 国产乡下妇女做爰 | 亚洲狠狠丁香婷婷综合久久久 | 亚洲毛片在线观看 | 91网视频 | 国产精品国产三级国产aⅴ入口 | 自拍偷拍亚洲一区 | 成人在线观看欧美 | 免费观看国产视频在线 | 一级毛片,一级毛片 | 在线一区 | 精品毛片在线观看 | 久久精品福利视频 | www.日本在线播放 | 久久精品视频亚洲 | 国产91精品久久久久久久网曝门 | 亚洲精品大片 | 成人午夜影院 | 欧美激情va永久在线播放 | 国产一区二区三区视频免费观看 | 91免费高清视频 | 日韩欧美成人一区二区三区 | 日韩中文字幕一区二区 | 日韩精品久久久 | 日韩精品一区二区三区 | 欧美中文字幕一区二区 | 华丽的挑战在线观看 | 一道本在线 | 99re视频在线观看 | 国产欧美日韩一区二区三区在线 | 国精品一区 | 亚洲日韩中文字幕 | 中文字幕国产视频 | 日本一区二区高清不卡 | 亚洲国产精品激情在线观看 | 欧美激情久久久久久 | 在线日韩福利 | 国产精品久久久久久久久免费樱桃 | 色婷婷九月 | 日本欧美黄色片 |