日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Winform中C#線程控制的四種常見情況分析

Winform界面中,將事務(wù)放在新開的線程中操作是十分有用的做法,因?yàn)檫@樣可以增加用戶體驗(yàn),減少耗時(shí)。對(duì)這些C#線程的控制,常常有下面這四種情況:

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括秦淮網(wǎng)站建設(shè)、秦淮網(wǎng)站制作、秦淮網(wǎng)頁制作以及秦淮網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,秦淮網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到秦淮省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

1. 啟動(dòng)線程;

2. 線程間通訊;

3. 線程終止;

4. 線程中的異常處理;

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

C#線程控制1. 啟動(dòng)C#線程

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C# code

 
 
 
  1. using System; 
  2. using System.Threading; 
  3. using System.Collections; 
  4. using System.Collections.Generic; 
  5. public class SyncEvents 
  6. public SyncEvents() 
  7. _newItemEvent = new AutoResetEvent(false); 
  8. _exitThreadEvent = new ManualResetEvent(false); 
  9. _eventArray = new WaitHandle[2]; 
  10. _eventArray[0] = _newItemEvent; 
  11. _eventArray[1] = _exitThreadEvent; 
  12. public EventWaitHandle ExitThreadEvent 
  13. get { return _exitThreadEvent; } 
  14. public EventWaitHandle NewItemEvent 
  15. get { return _newItemEvent; } 
  16. public WaitHandle[] EventArray 
  17. get { return _eventArray; } 
  18. private EventWaitHandle _newItemEvent; 
  19. private EventWaitHandle _exitThreadEvent; 
  20. private WaitHandle[] _eventArray; 
  21. public class Producer 
  22. public Producer(Queue  q, SyncEvents e) 
  23. _queue = q; 
  24. _syncEvents = e; 
  25. // Producer.ThreadRun 
  26. public void ThreadRun() 
  27. int count = 0; 
  28. Random r = new Random(); 
  29. while (!_syncEvents.ExitThreadEvent.WaitOne(0, false)) 
  30. lock (((ICollection)_queue).SyncRoot) 
  31. while (_queue.Count < 20) 
  32. _queue.Enqueue(r.Next(0,100)); 
  33. _syncEvents.NewItemEvent.Set(); 
  34. count++; 
  35. Console.WriteLine("Producer thread: produced {0} items", count); 
  36. private Queue  _queue; 
  37. private SyncEvents _syncEvents; 
  38. public class Consumer 
  39. public Consumer(Queue  q, SyncEvents e) 
  40. _queue = q; 
  41. _syncEvents = e; 
  42. // Consumer.ThreadRun 
  43. public void ThreadRun() 
  44. int count = 0; 
  45. while (WaitHandle.WaitAny(_syncEvents.EventArray) != 1) 
  46. lock (((ICollection)_queue).SyncRoot) 
  47. int item = _queue.Dequeue(); 
  48. count++; 
  49. Console.WriteLine("Consumer Thread: consumed {0} items", count); 
  50. private Queue  _queue; 
  51. private SyncEvents _syncEvents; 
  52. public class ThreadSyncSample 
  53. private static void ShowQueueContents(Queue  q) 
  54. lock (((ICollection)q).SyncRoot) 
  55. foreach (int item in q) 
  56. Console.Write("{0} ", item); 
  57. Console.WriteLine(); 
  58. static void Main() 
  59. Queue  queue = new Queue (); 
  60. SyncEvents syncEvents = new SyncEvents(); 
  61. Console.WriteLine("Configuring worker threads..."); 
  62. Producer producer = new Producer(queue, syncEvents); 
  63. Consumer consumer = new Consumer(queue, syncEvents); 
  64. Thread producerThread = new Thread(producer.ThreadRun); 
  65. Thread consumerThread = new Thread(consumer.ThreadRun); 
  66. Console.WriteLine("Launching producer and consumer threads...");
  67. producerThread.Start(); 
  68. consumerThread.Start(); 
  69. for (int i=0; i <4; i++) 
  70. Thread.Sleep(2500); 
  71. ShowQueueContents(queue); 
  72. Console.WriteLine("Signaling threads to terminate..."); 
  73. syncEvents.ExitThreadEvent.Set(); 
  74. producerThread.Join(); 
  75. consumerThread.Join(); 
  76. }

標(biāo)題名稱:Winform中C#線程控制的四種常見情況分析
文章路徑:http://www.5511xx.com/article/cddsecc.html