1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11.  
  12. namespace WindowsFormsApplication1
  13. {
  14. public partial class Form5 : Form
  15. {
  16. public Form5()
  17. {
  18. InitializeComponent();
  19. }
  20. string aa = "aaaa";
  21. bool bl = false;
  22. private object syncstate = new object();
  23. TaskScheduler scheduler = null;
  24. System.Timers.Timer tmPulse = new System.Timers.Timer();//位置刷新
  25. System.Timers.Timer tmPulse1 = new System.Timers.Timer();//位置刷新
  26. Thread t;
  27. Thread t1;
  28. Thread t2;
  29. private void Form5_Load(object sender, EventArgs e)
  30. {
  31. scheduler = TaskScheduler.FromCurrentSynchronizationContext();
  32. t = new Thread(new ThreadStart(SetData));
  33. t.IsBackground = true;
  34. t.Start();
  35.  
  36. t1 = new Thread(new ThreadStart(Set1));
  37. t1.IsBackground = true;
  38. t1.Start();
  39.  
  40. t2 = new Thread(new ThreadStart(Set2));
  41. t2.IsBackground = true;
  42. t2.Start();
  43. }
  44.  
  45. void Set()
  46. {
  47. tmPulse.Interval = ;
  48. tmPulse.AutoReset = true;//设置是执行一次(false)还是一直执行(true); 位置刷新
  49. tmPulse.Start();
  50. tmPulse.Elapsed += (o, a) =>
  51. {
  52. SetData();
  53. };
  54. tmPulse.Enabled = true;
  55.  
  56. tmPulse1.Interval = ;
  57. tmPulse1.AutoReset = true;//设置是执行一次(false)还是一直执行(true); 位置刷新
  58. tmPulse1.Start();
  59. tmPulse1.Elapsed += (o, a) =>
  60. {
  61. Set1();
  62. };
  63. tmPulse1.Enabled = true;
  64.  
  65. }
  66. void SetData()
  67. {
  68. while (true)
  69. {
  70.  
  71. for (int i = ; i < ; i++)
  72. {
  73. if (i == )
  74. {
  75. ShowMessage("执行结果,是否成功?", "结果确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
  76. }
  77. Task.Factory.StartNew(() =>
  78. {
  79. lock (syncstate)
  80. {
  81. textBox1.Text += ("测试:" + aa + " " + i + "\r\n");
  82. textBox1.SelectionStart = textBox1.Text.Length;
  83. this.textBox1.ScrollToCaret();
  84. }
  85. }, CancellationToken.None, TaskCreationOptions.None, scheduler);
  86. Thread.Sleep();
  87. aa = "第一个测试";
  88. if (i == )
  89. {
  90.  
  91. }
  92. }
  93. return;
  94. }
  95. }
  96. void Set1()
  97. {
  98. while (true)
  99. {
  100.  
  101. for (int i = ; i < ; i++)
  102. {
  103. Task.Factory.StartNew(() =>
  104. {
  105. lock (syncstate)
  106. {
  107. textBox1.Text += ("设置1:" + aa + " " + i + "\r\n");
  108. textBox1.SelectionStart = textBox1.Text.Length;
  109. this.textBox1.ScrollToCaret();
  110. }
  111. }, CancellationToken.None, TaskCreationOptions.None, scheduler);
  112. aa = "第1个设置" + i;
  113. Thread.Sleep();
  114. }
  115. Task.Factory.StartNew(() =>
  116. {
  117. lock (syncstate)
  118. {
  119. textBox1.Text += ("设置1:完成\r\n");
  120. textBox1.SelectionStart = textBox1.Text.Length;
  121. this.textBox1.ScrollToCaret();
  122. }
  123. }, CancellationToken.None, TaskCreationOptions.None, scheduler);
  124. return;
  125. }
  126. }
  127. void Set2()
  128. {
  129. while (!bl)
  130. {
  131. for (int i = ; i < ; i++)
  132. {
  133. Task.Factory.StartNew(() =>
  134. {
  135. lock (syncstate)
  136. {
  137. textBox1.Text += ("设置2:" + aa + " " + i + "\r\n");
  138. textBox1.SelectionStart = textBox1.Text.Length;
  139. this.textBox1.ScrollToCaret();
  140. }
  141. }, CancellationToken.None, TaskCreationOptions.None, scheduler);
  142. aa = "第2个设置" + i;
  143. Thread.Sleep();
  144. }
  145. }
  146. }
  147. private void button1_Click(object sender, EventArgs e)
  148. {
  149. bl = true;
  150. }
  151.  
  152. public DialogResult ShowMessage(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
  153. {
  154. var dr = new DialogResult();
  155. try
  156. {
  157. var tmp = this.Invoke(new MessageBoxShow(MessageBoxShowF), new object[] { text, caption, buttons, icon });
  158. if (tmp != null)
  159. {
  160. dr = (DialogResult)tmp;
  161. }
  162. }
  163. catch
  164. {
  165.  
  166. }
  167. return dr;
  168. }
  169. delegate DialogResult MessageBoxShow(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon);
  170. DialogResult MessageBoxShowF(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
  171. {
  172.  
  173. var dr = MessageBox.Show(text, caption, buttons, icon);
  174. return dr;
  175. }
  176.  
  177. private void Form5_FormClosed(object sender, FormClosedEventArgs e)
  178. {
  179. t.Abort();
  180. t.Join();
  181.  
  182. t1.Abort();
  183. t1.Join();
  184. t2.Abort();
  185. t2.Join();
  186. }
  187. }
  188. }

c#多线程操作测试(阻塞线程,结束任务)的更多相关文章

  1. C# 多线程join的用法,等待多个子线程结束后再执行主线程

    等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = ...

  2. Java多线程之以7种方式让主线程等待子线程结束

    记一次主线程等待子线程结束的多种方法的学习 在学习多线程时,最开始遇到的问题其实是"计算子线程运行时间",写到最后发现本文和标题更为符合,但是仍然基于问题:"在主线程中获 ...

  3. .NET面试题解析(07)-多线程编程与线程同步

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...

  4. .NET面试题解析(07)-多线程编程与线程同步 (转)

    http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...

  5. VC中利用多线程技术实现线程之间的通信

    当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...

  6. Qt线程QThread简析(8个线程等级,在UI线程里可调用thread->wait()等待线程结束,exit()可直接退出线程,setStackSize设置线程堆栈,首次见到Qt::HANDLE,QThreadData和QThreadPrivate)

    QThread实例代表一个线程,我们可以重新实现QThread::run(),要新建一个线程,我们应该先继承QThread并重新实现run()函数. 需要注意的是: 1.必须在创建QThread对象之 ...

  7. Java多线程学习(二)---线程创建方式

    线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...

  8. 一般来说,主方法main()结束的时候线程结束

    suspend()是将一个运行时状态进入阻塞状态(注意不释放锁标记).恢复状态的时候用resume().Stop()指释放全部. 这几个方法上都有Deprecated标志,说明这个方法不推荐使用. 一 ...

  9. java多线程三之线程协作与通信实例

    多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition. ...

  10. Delphi 实现多线程编程的线程类 TThread

    http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉 ...

随机推荐

  1. 错误解决:error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token

    今天看到一个比较有趣的题目,如下代码,分析输出结果 #include <stdio.h> void num(int &b) { b = 222; return; } int mai ...

  2. Google的10大座右铭

    1. 以用户为中心,其他一切纷至沓来. 创建伊始,Google 即以提供最佳的用户体验为其中心任务.虽然很多公司主张客户利益优先,但难以抗拒各种诱惑,往往会牺牲客户的少量利益来增加股东价值. Goog ...

  3. Java 学习(11): 面向对象编程—继承(super,this)

    Java 继承 what: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为.子类从它的父类中继承可访问的数据域和方法,也 ...

  4. 洛谷 P2128 赤壁之战

    P2128 赤壁之战 题目描述 赤壁之战,黄盖率舰满载薪草膏油诈降曹军. 受庞统所授的连环计,曹军战船之间由铁索相连,没有两艘战船在同一位置,也没有铁索两两相交或穿过战船.每艘船都有其一定的战略价值. ...

  5. [Angular + TsLint] Disable directive selector tslint error

    @Directive({ // tslint:disable-next-line:directive-selector selector: '[scrollable]' })

  6. wsimport 使用方法具体解释

    wsimport 使用方法 本文主要介绍wsimport的简单使用方法.帮助大家在webserviceclient开发过程中生成接口代码: 打开java JDK文件夹我们会看到wsimport工具,这 ...

  7. 一起talk C栗子吧(第九十五回:C语言实例--使用共享内存进行进程间通信一)

    各位看官们,大家好,上一回中咱们说的是SystemV IPC结构概述的样例,这一回咱们说的样例是:使用共享内存进行进程间通信. 闲话休提.言归正转.让我们一起talk C栗子吧! 共享内存是Syste ...

  8. (数据结构整理)NJUPT1054

    这一篇博客以一些OJ上的题目为载体,整理一下数据结构.会陆续的更新. .. 我们都知道,数据结构的灵活应用有时能让简化一些题目的解答. 一.栈的应用 1.NJUPT OJ 1054(回文串的推断) 回 ...

  9. 【大话QT之十六】使用ctkPluginFramework插件系统构建项目实战

    "使用ctkPluginFramework插件系统构建项目实战",这篇文章是写博客以来最纠结的一篇文章. 倒不是由于技术都多么困难,而是想去描写叙述一个项目架构採用ctkPlugi ...

  10. <Sicily> 生成字符串

    一.题目描述 假设一个字符串只由字符'0','1','?'组成,其中字符'?'表示该字符可由字符'0'或'1'替代. 现有一些字符串,根据这些字符串生成所有可生成的字符串. 如:{10,?1,0? } ...