自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

1. 啟動線程;

2. 線程間通訊;

3. 線程終止;

4. 線程中的異常處理;

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

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

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

◆Thread.Start(參數(shù)object);

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

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

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

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

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

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

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

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

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

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

用于C#線程通訊的lock關(guān)鍵字

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

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

除了用 lock 關(guān)鍵字來阻止同時訪問外,還用兩個事件對象提供進一步的同步。一個事件對象用來通知輔助線程終止,另一個事件對象由制造者線程用來在有新項添加到隊列中時通知使用者線程。這兩個事件對象封裝在一個名為 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#線程相關(guān)問題總結(jié):基本操作及UI控件交互
  3. 學習C#多線程:lock的用法
  4. 總結(jié)C#多線程的點點滴滴
  5. 學習C#實現(xiàn)HTTP協(xié)議:多線程文件傳輸
責任編輯:yangsai 來源: CSDN論壇
相關(guān)推薦

2024-10-24 08:04:00

2009-08-28 16:51:32

C#線程控制

2009-08-26 15:04:35

C#轉(zhuǎn)換

2009-08-20 09:52:31

C#參數(shù)類型

2024-05-29 13:18:12

線程Thread?方式

2009-08-05 14:09:04

C#日期轉(zhuǎn)換

2009-09-08 17:20:01

C#排序算法

2011-11-24 16:34:39

Java

2021-08-12 11:37:23

數(shù)據(jù)分析錯誤

2009-09-17 16:55:58

C#組件設(shè)計

2009-09-22 14:20:39

C#播放聲音

2023-10-30 11:40:36

OOM線程池單線程

2020-06-17 08:31:10

權(quán)限控制Spring Secu

2021-07-27 10:49:10

SpringSecurity權(quán)限

2021-06-04 10:45:31

軟件架構(gòu)分布式

2024-06-24 01:00:00

2009-08-17 16:56:51

C#多線程控制進度條

2017-04-17 19:31:03

Android多線程

2019-04-03 05:04:50

2020-06-24 07:49:13

Kubernetes場景網(wǎng)絡
點贊
收藏

51CTO技術(shù)棧公眾號