TaskTEST.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Diagnostics;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. namespace TestProject
  14. {
  15. public partial class TaskTEST : Form
  16. {
  17. public TaskTEST()
  18. {
  19. InitializeComponent();
  20. }
  21. private Stopwatch stopWatch = new Stopwatch();
  22. public void ParallelInvokeMethod1()
  23. {
  24. Parallel.For(0, 100, item =>
  25. {
  26. DoWork(item);
  27. });
  28. }
  29. private void DoWork(int item)
  30. {
  31. }
  32. public void ParallelBreak()
  33. {
  34. ConcurrentBag<int> bag = new ConcurrentBag<int>();
  35. stopWatch.Start();
  36. Parallel.For(0, 5000, (i, state) =>
  37. {
  38. if (bag.Count == 3000)
  39. {
  40. state.Stop();
  41. return;
  42. }
  43. bag.Add(i);
  44. });
  45. stopWatch.Stop();
  46. Console.WriteLine("Bag count is " + bag.Count + ", " + stopWatch.ElapsedMilliseconds);
  47. }
  48. public void Run1()
  49. {
  50. Thread.Sleep(2000);
  51. Console.WriteLine("Task 1 is cost 2 sec");
  52. throw new Exception("Exception in task 1");
  53. }
  54. public void Run2()
  55. {
  56. Thread.Sleep(3000);
  57. Console.WriteLine("Task 2 is cost 3 sec");
  58. throw new Exception("Exception in task 2");
  59. }
  60. public void ParallelInvokeMethod()
  61. {
  62. stopWatch.Start();
  63. try
  64. {
  65. Parallel.Invoke(Run1, Run2);
  66. }
  67. catch (AggregateException aex)
  68. {
  69. foreach (var ex in aex.InnerExceptions)
  70. {
  71. Console.WriteLine(ex.Message);
  72. }
  73. }
  74. stopWatch.Stop();
  75. Console.WriteLine("Parallel run " + stopWatch.ElapsedMilliseconds + " ms.");
  76. stopWatch.Reset();
  77. stopWatch.Start();
  78. try
  79. {
  80. Run1();
  81. Run2();
  82. }
  83. catch (Exception ex)
  84. {
  85. Console.WriteLine(ex.Message);
  86. }
  87. stopWatch.Stop();
  88. Console.WriteLine("Normal run " + stopWatch.ElapsedMilliseconds + " ms.");
  89. }
  90. private void Form3_Load(object sender, EventArgs e)
  91. {
  92. //var task1 = new Task(() =>
  93. //{
  94. // Console.WriteLine("Begin");
  95. // Thread.Sleep(2000);
  96. // Console.WriteLine("Finish");
  97. //});
  98. //Console.WriteLine("Before start:" + task1.Status);
  99. //task1.Start();
  100. //Console.WriteLine("After start:" + task1.Status);
  101. //task1.Wait();
  102. //Console.WriteLine("After Finish:" + task1.Status);
  103. //Console.Read();
  104. //var task1 = new System.Threading.Tasks.Task(() =>
  105. //{
  106. // Console.WriteLine("Task 1 Begin");
  107. // Thread.Sleep(2000);
  108. // Console.WriteLine("Task 1 Finish");
  109. //});
  110. //var task2 = new System.Threading.Tasks.Task(() =>
  111. //{
  112. // Console.WriteLine("Task 2 Begin");
  113. // Thread.Sleep(3000);
  114. // Console.WriteLine("Task 2 Finish");
  115. //});
  116. //task1.Start();
  117. //task2.Start();
  118. //var result = task1.ContinueWith(task =>
  119. //{
  120. // Console.WriteLine("task1 finished!");
  121. // return "This is task result!";
  122. //});
  123. //Console.WriteLine(result.Result.ToString());
  124. //TaskFactory tf = new TaskFactory();
  125. //var SendFeedBackTask = tf.StartNew(() => { Console.WriteLine("Get some Data!"); })
  126. // .ContinueWith(s => { return false; })
  127. // .ContinueWith<string>(r =>
  128. // {
  129. // if (r.Result)
  130. // {
  131. // return "Finished";
  132. // }
  133. // else
  134. // {
  135. // return "Error";
  136. // }
  137. // });
  138. //Console.WriteLine(SendFeedBackTask.Result);
  139. //线程取消
  140. var tokenSource = new CancellationTokenSource();
  141. var token = tokenSource.Token;
  142. var task = new TaskFactory().StartNew(() =>
  143. {
  144. for (var i = 0; i < 1000; i++)
  145. {
  146. Thread.Sleep(1000);
  147. if (token.IsCancellationRequested)
  148. {
  149. Console.WriteLine("Abort mission success!");
  150. return;
  151. }
  152. Console.WriteLine("TASK");
  153. }
  154. }, token);
  155. token.Register(() =>
  156. {
  157. Console.WriteLine("Canceled");
  158. });
  159. Console.WriteLine("Press enter to cancel task...");
  160. Thread.Sleep(10000);
  161. tokenSource.Cancel();
  162. //关联子进程
  163. //var pTask = new TaskFactory().StartNew(() =>
  164. //{
  165. // var cTask = new TaskFactory().StartNew(() =>
  166. // {
  167. // Thread.Sleep(2000);
  168. // Console.WriteLine("Childen task finished!");
  169. // });
  170. // Console.WriteLine("Parent task finished!");
  171. //});
  172. //pTask.Wait();
  173. //Console.WriteLine("Flag");
  174. //Console.Read();
  175. //加入关联关系,父Task会等子Task完成后才继续执行
  176. //var pTask = new TaskFactory().StartNew(() =>
  177. //{
  178. // var cTask = new TaskFactory().StartNew(() =>
  179. // {
  180. // Console.WriteLine("Childen task finished!");
  181. // }, TaskCreationOptions.AttachedToParent);
  182. // Thread.Sleep(2000);
  183. // Console.WriteLine("Parent task finished!");
  184. //});
  185. //pTask.Wait();
  186. //System.Threading.Tasks.Task.WaitAll();
  187. //Console.WriteLine("Flag");
  188. }
  189. }
  190. }