code_junkie

.NET: How to have background thread signal main thread data is available?

Nov 11th, 2011
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.89 KB | None | 0 0
  1. private static BackgroundWorker worker = new BackgroundWorker();
  2. static void Main(string[] args)
  3. {
  4. worker.DoWork += worker_DoWork;
  5. worker.RunWorkerCompleted += worker_RunWorkerCompleted;
  6. worker.ProgressChanged += worker_ProgressChanged;
  7. worker.WorkerReportsProgress = true;
  8.  
  9. Console.WriteLine("Starting application.");
  10. worker.RunWorkerAsync();
  11.  
  12. Console.ReadKey();
  13. }
  14.  
  15. static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  16. {
  17. Console.WriteLine("Progress.");
  18. }
  19.  
  20. static void worker_DoWork(object sender, DoWorkEventArgs e)
  21. {
  22. Console.WriteLine("Starting doing some work now.");
  23.  
  24. for (int i = 0; i < 5; i++)
  25. {
  26. Thread.Sleep(1000);
  27. worker.ReportProgress(i);
  28. }
  29. }
  30.  
  31. static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  32. {
  33. Console.WriteLine("Done now.");
  34. }
  35.  
  36. using System;
  37. using System.Collections.Generic;
  38. using System.Threading;
  39.  
  40. namespace ConsoleApplication1
  41. {
  42. class Program
  43. {
  44. private static object LockObject = new Object();
  45.  
  46. private static AutoResetEvent _flag;
  47. private static Queue<int> _list;
  48.  
  49. static void Main(string[] args)
  50. {
  51. _list = new Queue<int>();
  52. _flag = new AutoResetEvent(false);
  53.  
  54. ThreadPool.QueueUserWorkItem(ProducerThread);
  55.  
  56. int itemCount = 0;
  57.  
  58. while (itemCount < 10)
  59. {
  60. if (_flag.WaitOne(0))
  61. {
  62. // there was an item
  63. lock (LockObject)
  64. {
  65. Console.WriteLine("Items in queue:");
  66. while (_list.Count > 0)
  67. {
  68. Console.WriteLine("Found item {0}.", _list.Dequeue());
  69. itemCount++;
  70. }
  71. }
  72. }
  73. else
  74. {
  75. Console.WriteLine("No items in queue.");
  76. Thread.Sleep(125);
  77. }
  78. }
  79. }
  80.  
  81. private static void ProducerThread(object state)
  82. {
  83. Random rng = new Random();
  84.  
  85. Thread.Sleep(250);
  86.  
  87. for (int i = 0; i < 10; i++)
  88. {
  89. lock (LockObject)
  90. {
  91. _list.Enqueue(rng.Next(0, 100));
  92. _flag.Set();
  93. Thread.Sleep(rng.Next(0, 250));
  94. }
  95. }
  96. }
  97. }
  98.  
  99. private static AutoResetEvent _flag;
  100. private static Queue<int> _list;
  101.  
  102. static void Main(string[] args)
  103. {
  104. _list = new Queue<int>();
  105. _flag = new AutoResetEvent(false);
  106.  
  107. ThreadPool.QueueUserWorkItem(ProducerThread);
  108.  
  109. int itemCount = 0;
  110.  
  111. while (itemCount < 10)
  112. {
  113. if (_flag.WaitOne(0))
  114. {
  115. // there was an item
  116. lock (LockObject)
  117. {
  118. Console.WriteLine("Items in queue:");
  119. while (_list.Count > 0)
  120. {
  121. Console.WriteLine("Found item {0}.", _list.Dequeue());
  122. itemCount++;
  123. }
  124. }
  125. }
  126. else
  127. {
  128. Console.WriteLine("No items in queue.");
  129. Thread.Sleep(125);
  130. }
  131. }
  132. }
  133.  
  134. private static void ProducerThread(object state)
  135. {
  136. Random rng = new Random();
  137.  
  138. Thread.Sleep(250);
  139.  
  140. for (int i = 0; i < 10; i++)
  141. {
  142. lock (LockObject)
  143. {
  144. _list.Enqueue(rng.Next(0, 100));
  145. _flag.Set();
  146. Thread.Sleep(rng.Next(0, 250));
  147. }
  148. }
  149. }
  150. }
  151.  
  152. AutoResetEvent ev = new AutoResetEvent(false);
  153. ...
  154. if(ev.WaitOne(0, false)) {
  155. // event happened
  156. }
  157. else {
  158. // do other stuff
  159. }
  160.  
  161. this.asyncOperation = AsyncOperationManager.CreateOperation(null);
  162. this.asyncOperation.Post(delegateMethod, arg);
Add Comment
Please, Sign In to add comment