• c#多线程同步执行


    对于多线程同步执行,可能听起来比较拗口,但是它的作用在某些业务下,有非常的大作用,分别进行阐述。

    同步

    同步就是按照顺序1234这样进行下去,有顺序,有规律的进行着。

    多线程

    多线程对于单线程来说的,单线程,就是开启一个线程进行工作,多线程则是,开启多个线程进行多个工作,并且没有顺序,没有规律性。

    多线程同步,则是,既有同步和多线程的特点,即开启多个线程进行工作的同时,还要按照顺序和规律执行。

    其实,解决多线性同步的问题,有很多种,比如使用lock锁等等方法。本节介绍使用async/await的方法来实现他的功能。

    1.建立一个winform程序,可以模拟界面处理数据

    2.使用同步的方法

    对变量a增加1,其中 Thread.Sleep(1000)可以表示,这个业务处理的时间,然后连续增加5次。

    代码

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Diagnostics;
    6. using System.Drawing;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading;
    10. using System.Threading.Tasks;
    11. using System.Windows.Forms;
    12. namespace WindowsFormsApp1
    13. {
    14. public partial class Form1 : Form
    15. {
    16. int a = 0;
    17. public Form1()
    18. {
    19. InitializeComponent();
    20. }
    21. private void button1_Click(object sender, EventArgs e)
    22. {
    23. Stopwatch stopwatch = new Stopwatch();
    24. stopwatch.Start();
    25. A();
    26. //Task.Delay(3000);
    27. //B();
    28. //Task.Delay(3000);
    29. //await C();
    30. stopwatch.Stop();
    31. label1.Text = a.ToString();
    32. label2.Text = "耗时:" + stopwatch.ElapsedMilliseconds;
    33. //Thread.Sleep(10000);
    34. }
    35. ///
    36. /// 单线程,同步有顺序
    37. ///
    38. public void A()
    39. {
    40. a++;
    41. Console.WriteLine(a);
    42. Thread.Sleep(1000);
    43. a++; Console.WriteLine(a);
    44. Thread.Sleep(1000);
    45. a++; Console.WriteLine(a);
    46. Thread.Sleep(1000);
    47. a++; Console.WriteLine(a);
    48. Thread.Sleep(1000);
    49. a++; Console.WriteLine(a);
    50. Thread.Sleep(1000);
    51. }
    52. ///
    53. /// 多线程,并行,没有顺序
    54. ///
    55. public void B()
    56. {
    57. Task.Run(() =>
    58. {
    59. a++;
    60. Console.WriteLine(a);
    61. Thread.Sleep(10000);
    62. });
    63. Task.Run(() =>
    64. {
    65. a++;
    66. Console.WriteLine(a);
    67. Thread.Sleep(10000);
    68. });
    69. Task.Run(() =>
    70. {
    71. a++;
    72. Console.WriteLine(a);
    73. Thread.Sleep(10000);
    74. });
    75. Task.Run(() =>
    76. {
    77. a++;
    78. Console.WriteLine(a);
    79. Thread.Sleep(10000);
    80. });
    81. Task.Run(() =>
    82. {
    83. a++;
    84. Console.WriteLine(a);
    85. Thread.Sleep(10000);
    86. });
    87. //List tasks = new List();
    88. //tasks.Add(Task.Run(() =>
    89. //{
    90. // a++;
    91. // Console.WriteLine(a);
    92. // Thread.Sleep(1000);
    93. //}));
    94. //tasks.Add(Task.Run(() =>
    95. //{
    96. // a++;
    97. // Console.WriteLine(a);
    98. // Thread.Sleep(1000);
    99. //}));
    100. //tasks.Add(Task.Run(() =>
    101. //{
    102. // a++;
    103. // Console.WriteLine(a);
    104. // Thread.Sleep(1000);
    105. //}));
    106. //tasks.Add(Task.Run(() =>
    107. //{
    108. // a++;
    109. // Console.WriteLine(a);
    110. // Thread.Sleep(1000);
    111. //}));
    112. //tasks.Add(Task.Run(() =>
    113. //{
    114. // a++;
    115. // Console.WriteLine(a);
    116. // Thread.Sleep(1000);
    117. //}));
    118. //Task.WaitAll(tasks.ToArray());
    119. }
    120. ///
    121. /// 多线程,并行,有顺序
    122. ///
    123. ///
    124. public async Task C()
    125. {
    126. Task task = Task.Run(() =>
    127. {
    128. a++;
    129. Console.WriteLine(a);
    130. Thread.Sleep(1000);
    131. });
    132. await task;
    133. Task task1 = Task.Run(() =>
    134. {
    135. a++;
    136. Console.WriteLine(a);
    137. Thread.Sleep(1000);
    138. });
    139. await task1;
    140. Task task2 = Task.Run(() =>
    141. {
    142. a++;
    143. Console.WriteLine(a);
    144. Thread.Sleep(1000);
    145. });
    146. await task2;
    147. Task task3 = Task.Run(() =>
    148. {
    149. a++;
    150. Console.WriteLine(a);
    151. Thread.Sleep(1000);
    152. });
    153. await task3;
    154. Task task4 = Task.Run(() =>
    155. {
    156. a++;
    157. Console.WriteLine(a);
    158. Thread.Sleep(1000);
    159. });
    160. await task4;
    161. }
    162. }
    163. }

    效果

    耗时5036,按照顺序执行,并且界面是卡死状态。

    3.使用多线程的方法

    因为变化太快了,所以增加了延迟

    多线程,还可以使用B()中屏蔽的方法

    代码

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Diagnostics;
    6. using System.Drawing;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading;
    10. using System.Threading.Tasks;
    11. using System.Windows.Forms;
    12. namespace WindowsFormsApp1
    13. {
    14. public partial class Form1 : Form
    15. {
    16. int a = 0;
    17. public Form1()
    18. {
    19. InitializeComponent();
    20. }
    21. private void button1_Click(object sender, EventArgs e)
    22. {
    23. Stopwatch stopwatch = new Stopwatch();
    24. stopwatch.Start();
    25. //A();
    26. Task.Delay(3000);
    27. B();
    28. Task.Delay(3000);
    29. //await C();
    30. stopwatch.Stop();
    31. label1.Text = a.ToString();
    32. label2.Text = "耗时:" + stopwatch.ElapsedMilliseconds;
    33. //Thread.Sleep(10000);
    34. }
    35. ///
    36. /// 单线程,同步有顺序
    37. ///
    38. public void A()
    39. {
    40. a++;
    41. Console.WriteLine(a);
    42. Thread.Sleep(1000);
    43. a++; Console.WriteLine(a);
    44. Thread.Sleep(1000);
    45. a++; Console.WriteLine(a);
    46. Thread.Sleep(1000);
    47. a++; Console.WriteLine(a);
    48. Thread.Sleep(1000);
    49. a++; Console.WriteLine(a);
    50. Thread.Sleep(1000);
    51. }
    52. ///
    53. /// 多线程,并行,没有顺序
    54. ///
    55. public void B()
    56. {
    57. Task.Run(() =>
    58. {
    59. a++;
    60. Console.WriteLine(a);
    61. Thread.Sleep(10000);
    62. });
    63. Task.Run(() =>
    64. {
    65. a++;
    66. Console.WriteLine(a);
    67. Thread.Sleep(10000);
    68. });
    69. Task.Run(() =>
    70. {
    71. a++;
    72. Console.WriteLine(a);
    73. Thread.Sleep(10000);
    74. });
    75. Task.Run(() =>
    76. {
    77. a++;
    78. Console.WriteLine(a);
    79. Thread.Sleep(10000);
    80. });
    81. Task.Run(() =>
    82. {
    83. a++;
    84. Console.WriteLine(a);
    85. Thread.Sleep(10000);
    86. });
    87. //List tasks = new List();
    88. //tasks.Add(Task.Run(() =>
    89. //{
    90. // a++;
    91. // Console.WriteLine(a);
    92. // Thread.Sleep(1000);
    93. //}));
    94. //tasks.Add(Task.Run(() =>
    95. //{
    96. // a++;
    97. // Console.WriteLine(a);
    98. // Thread.Sleep(1000);
    99. //}));
    100. //tasks.Add(Task.Run(() =>
    101. //{
    102. // a++;
    103. // Console.WriteLine(a);
    104. // Thread.Sleep(1000);
    105. //}));
    106. //tasks.Add(Task.Run(() =>
    107. //{
    108. // a++;
    109. // Console.WriteLine(a);
    110. // Thread.Sleep(1000);
    111. //}));
    112. //tasks.Add(Task.Run(() =>
    113. //{
    114. // a++;
    115. // Console.WriteLine(a);
    116. // Thread.Sleep(1000);
    117. //}));
    118. //Task.WaitAll(tasks.ToArray());
    119. }
    120. ///
    121. /// 多线程,并行,有顺序
    122. ///
    123. ///
    124. public async Task C()
    125. {
    126. Task task = Task.Run(() =>
    127. {
    128. a++;
    129. Console.WriteLine(a);
    130. Thread.Sleep(1000);
    131. });
    132. await task;
    133. Task task1 = Task.Run(() =>
    134. {
    135. a++;
    136. Console.WriteLine(a);
    137. Thread.Sleep(1000);
    138. });
    139. await task1;
    140. Task task2 = Task.Run(() =>
    141. {
    142. a++;
    143. Console.WriteLine(a);
    144. Thread.Sleep(1000);
    145. });
    146. await task2;
    147. Task task3 = Task.Run(() =>
    148. {
    149. a++;
    150. Console.WriteLine(a);
    151. Thread.Sleep(1000);
    152. });
    153. await task3;
    154. Task task4 = Task.Run(() =>
    155. {
    156. a++;
    157. Console.WriteLine(a);
    158. Thread.Sleep(1000);
    159. });
    160. await task4;
    161. }
    162. }
    163. }

    效果 

    耗时29,可以看到没有按照顺序进行,但是界面是可以移动的

    4. 多线程同步

    这段代码就阐述了,即开启多个线程进行工作的同时,还按照顺序和规律执行。

    代码

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Diagnostics;
    6. using System.Drawing;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading;
    10. using System.Threading.Tasks;
    11. using System.Windows.Forms;
    12. namespace WindowsFormsApp1
    13. {
    14. public partial class Form1 : Form
    15. {
    16. int a = 0;
    17. public Form1()
    18. {
    19. InitializeComponent();
    20. }
    21. private async void button1_Click(object sender, EventArgs e)
    22. {
    23. Stopwatch stopwatch = new Stopwatch();
    24. stopwatch.Start();
    25. //A();
    26. //Task.Delay(3000);
    27. //B();
    28. //Task.Delay(3000);
    29. await C();
    30. stopwatch.Stop();
    31. label1.Text = a.ToString();
    32. label2.Text = "耗时:" + stopwatch.ElapsedMilliseconds;
    33. //Thread.Sleep(10000);
    34. }
    35. ///
    36. /// 单线程,同步有顺序
    37. ///
    38. public void A()
    39. {
    40. a++;
    41. Console.WriteLine(a);
    42. Thread.Sleep(1000);
    43. a++; Console.WriteLine(a);
    44. Thread.Sleep(1000);
    45. a++; Console.WriteLine(a);
    46. Thread.Sleep(1000);
    47. a++; Console.WriteLine(a);
    48. Thread.Sleep(1000);
    49. a++; Console.WriteLine(a);
    50. Thread.Sleep(1000);
    51. }
    52. ///
    53. /// 多线程,并行,没有顺序
    54. ///
    55. public void B()
    56. {
    57. Task.Run(() =>
    58. {
    59. a++;
    60. Console.WriteLine(a);
    61. Thread.Sleep(10000);
    62. });
    63. Task.Run(() =>
    64. {
    65. a++;
    66. Console.WriteLine(a);
    67. Thread.Sleep(10000);
    68. });
    69. Task.Run(() =>
    70. {
    71. a++;
    72. Console.WriteLine(a);
    73. Thread.Sleep(10000);
    74. });
    75. Task.Run(() =>
    76. {
    77. a++;
    78. Console.WriteLine(a);
    79. Thread.Sleep(10000);
    80. });
    81. Task.Run(() =>
    82. {
    83. a++;
    84. Console.WriteLine(a);
    85. Thread.Sleep(10000);
    86. });
    87. //List tasks = new List();
    88. //tasks.Add(Task.Run(() =>
    89. //{
    90. // a++;
    91. // Console.WriteLine(a);
    92. // Thread.Sleep(1000);
    93. //}));
    94. //tasks.Add(Task.Run(() =>
    95. //{
    96. // a++;
    97. // Console.WriteLine(a);
    98. // Thread.Sleep(1000);
    99. //}));
    100. //tasks.Add(Task.Run(() =>
    101. //{
    102. // a++;
    103. // Console.WriteLine(a);
    104. // Thread.Sleep(1000);
    105. //}));
    106. //tasks.Add(Task.Run(() =>
    107. //{
    108. // a++;
    109. // Console.WriteLine(a);
    110. // Thread.Sleep(1000);
    111. //}));
    112. //tasks.Add(Task.Run(() =>
    113. //{
    114. // a++;
    115. // Console.WriteLine(a);
    116. // Thread.Sleep(1000);
    117. //}));
    118. //Task.WaitAll(tasks.ToArray());
    119. }
    120. ///
    121. /// 多线程,并行,有顺序
    122. ///
    123. ///
    124. public async Task C()
    125. {
    126. Task task = Task.Run(() =>
    127. {
    128. a++;
    129. Console.WriteLine(a);
    130. Thread.Sleep(1000);
    131. });
    132. await task;
    133. Task task1 = Task.Run(() =>
    134. {
    135. a++;
    136. Console.WriteLine(a);
    137. Thread.Sleep(1000);
    138. });
    139. await task1;
    140. Task task2 = Task.Run(() =>
    141. {
    142. a++;
    143. Console.WriteLine(a);
    144. Thread.Sleep(1000);
    145. });
    146. await task2;
    147. Task task3 = Task.Run(() =>
    148. {
    149. a++;
    150. Console.WriteLine(a);
    151. Thread.Sleep(1000);
    152. });
    153. await task3;
    154. Task task4 = Task.Run(() =>
    155. {
    156. a++;
    157. Console.WriteLine(a);
    158. Thread.Sleep(1000);
    159. });
    160. await task4;
    161. }
    162. }
    163. }

     效果

    耗时5052,并且是按照顺序执行的,而且界面还可以拖动,正是我们需要的。 

    拓展async/await

    在C()方法中,其实是遇到await后,代码则是返回task.run上面去了,然后从上到下再执行,执行到第二方法,又返回task.run上面去了,然后再从上到下执行,以此类推,所以和同步执行的时间基本上一样的。

  • 相关阅读:
    你用过 Maven Shade 插件吗?
    Spock单元测试框架介绍及在美团优选的实践___第一章
    dom的基础
    盛唐诗人三杰,儒释道的代表
    轻松实现PDF文件的在线浏览
    java毕业设计园林公司OA系统Mybatis+系统+数据库+调试部署
    Duchefa丨S0188盐酸大观霉素五水合物中英文说明书
    这3个高级前端常用的API,有你正在用的吗?
    Part 8:Pandas数据排序【Series和DataFrame的排序操作函数】
    常见的变体卷积
  • 原文地址:https://blog.csdn.net/u012563853/article/details/126168926