我们在用C# 开发程序时,经常会使用的多线程,实现多任务的处理。一般常用的方法是新建多个线程,进行处理。

今天我分享一个采用线程池的方式来实现的实例。对有需要的朋友做个借鉴。

实例: Winform

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Threading;
  9.  
  10. namespace MultiThreading
  11. {
  12. /// <summary>
  13. /// 此实例:为SDP软件快速开发平台中使用到的真实方法
  14. /// </summary>
  15. public partial class Form1 : Form
  16. {
  17. /// <summary>
  18. /// 私有:线程同步信号
  19. /// </summary>
  20. private ManualResetEvent cmdWaiter;
  21.  
  22. /// <summary>
  23. /// 委托更新进度条
  24. /// </summary>
  25. private delegate void updateBar();
  26.  
  27. /// <summary>
  28. /// 结束提示委托
  29. /// </summary>
  30. private delegate void showEnd();
  31.  
  32. /// <summary>
  33. /// 任务队列
  34. /// 注意:此任务队列 需要用户自动来定义
  35. /// 实例中采用 string 来处理
  36. /// </summary>
  37. private List<string> taskList = new List<string>();
  38.  
  39. /// <summary>
  40. /// 构造函数
  41. /// </summary>
  42. public Form1()
  43. {
  44. InitializeComponent();
  45. }
  46.  
  47. /// <summary>
  48. /// 页面初始化加载
  49. /// </summary>
  50. /// <param name="sender"></param>
  51. /// <param name="e"></param>
  52. private void Form1_Load(object sender, EventArgs e)
  53. {
  54.  
  55. // 阻塞当前线程
  56. cmdWaiter = new ManualResetEvent(false);
  57.  
  58. // 启动线程池
  59. ThreadPool.QueueUserWorkItem(new WaitCallback(this.On_ThreadEvent));
  60.  
  61. }
  62.  
  63. /// <summary>
  64. /// 线程处理事务
  65. /// </summary>
  66. /// <param name="obj"></param>
  67. private void On_ThreadEvent(object obj)
  68. {
  69. while (true)
  70. {
  71. try
  72. {
  73. // 阻塞当前线程,等待解除指令
  74. this.cmdWaiter.WaitOne();
  75.  
  76. // 执行我们需要处理的事务
  77. for (int k = ; k < taskList.Count; k++)
  78. {
  79. Run_MyBusiness(taskList[k]);
  80.  
  81. // 休息指定的毫秒
  82. Thread.Sleep();
  83. }
  84.  
  85. // 清除队列数据
  86. this.taskList.Clear();
  87.  
  88. this.On_EndLog();
  89. this.cmdWaiter.Reset();
  90. }
  91. catch (Exception e)
  92. {
  93. string strError = e.Message.ToString();
  94. this.taskList.Clear();
  95. this.cmdWaiter.Reset();
  96. }
  97. }
  98. }
  99.  
  100. /// <summary>
  101. /// 执行我们自己的业务
  102. /// </summary>
  103. /// <param name="str"></param>
  104. private void Run_MyBusiness(string str)
  105. {
  106. // 委托更新
  107. updateBar updateDelegate = new updateBar(On_Update);
  108. this.Invoke(updateDelegate);
  109. }
  110.  
  111. /// <summary>
  112. /// 开始按钮
  113. /// </summary>
  114. /// <param name="sender"></param>
  115. /// <param name="e"></param>
  116. private void btn_Start_Click(object sender, EventArgs e)
  117. {
  118.  
  119. this.taskList = new List<string>();
  120. for (int i = ; i < ; i++)
  121. {
  122. this.taskList.Add(i.ToString());
  123. }
  124.  
  125. this.txt_log.Text = "开始:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine;
  126.  
  127. this.pg_Bar.Value = ;
  128. this.pg_Bar.Maximum = this.taskList.Count;
  129.  
  130. // 解除阻塞
  131. this.cmdWaiter.Set();
  132. }
  133.  
  134. /// <summary>
  135. /// 更新进度条
  136. /// </summary>
  137. private void On_Update()
  138. {
  139. this.pg_Bar.Value = this.pg_Bar.Value + ;
  140. }
  141.  
  142. private void On_EndLog()
  143. {
  144. showEnd endDeg = new showEnd(On_UpdateTextBox);
  145. this.Invoke(endDeg);
  146. }
  147.  
  148. private void On_UpdateTextBox()
  149. {
  150. string runStr = "结束:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  151. this.txt_log.Text = this.txt_log.Text + runStr;
  152. }
  153. }
  154. }

运行效果:

下载地址:多线程实例 DEMO

Winform c# 多线程处理实例的更多相关文章

  1. 通过GUID确保winform运行唯一实例

    通过程序生成的GUIDwinform唯一实例 using System.Threading;bool createdNew; Guid ownGUID = new Guid(((GuidAttribu ...

  2. WinForm 登录窗体 + 单实例运行

    关于怎么在winform里增加登录窗体或者如何让winform程序单实例运行网上都很多例子. 然而两者结合起来呢? //Program.cs static class Program { public ...

  3. 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web

    实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义—请假申请流程-Web 参考文章: RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系 ...

  4. WinForm查询大数据界面假死,使用异步调用解决

    用DataGridView无分页绑定一个几千条数据的查询,查询的时候界面直接卡死十几秒,用户体验非常不好,因此用异步操作解决界面卡死的问题原本场景:点击[查询]后,界面直接卡死优化场景:点击[查询]后 ...

  5. [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二)

    上一节链接:http://www.cnblogs.com/zjutlitao/p/4116783.html 前言: 在上一节中我们已经大致介绍了该软件的是什么.可以干什么以及界面的大致样子.此外还详细 ...

  6. C#源码500份

    C Sharp  短信发送平台源代码.rar http://1000eb.com/5c6vASP.NET+AJAX基础示例 视频教程 http://1000eb.com/89jcC# Winform ...

  7. 2013年7月份第3周51Aspx源码发布详情

    批量重命名文件工具源码  2013-7-19 [VS2010]功能介绍:这是一个新型的文件重命名,主要用了TreeView(树形视图)来选择文件夹,批量进行文件重命名.其中,有"编号在前,编 ...

  8. JavaScript导航树

    JS导航树 整理之前的小代码片段,放到博客,便于以后完善查看: 该JS导航树实际效果,[GSP+社区网站专题课程页面导航树]地址:http://gsp.inspur.com/knowledge/zhu ...

  9. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

随机推荐

  1. k8s Ingress和ingress控制器

    ingress架构图简介 我们知道service的表现形式为IP:PORT,即工作在第四层传输层(TCP/IP层),那么对于不同的URL地址经常对应用不同的后端服务或者虚拟服务器,这些应用层的转发机制 ...

  2. [TCP/IP] TCP的重发机制是怎么实现的

    1)滑动窗口机制,确立收发的边界,能让发送方知道已经发送了多少(已确认).尚未确认的字节数.尚待发送的字节数:让接收方知道(已经确认收到的字节数) 2) 超时重传,tcp每发送一个报文段,就设置一次计 ...

  3. DNS分离解析

    实验环境: 一台内网(client)1块网卡:一台网关(dns)2块网卡:一台外网1块网卡 DNS服务器开启路由转发 [root@localhost ~]# vi /etc/sysctl.conf n ...

  4. UiPath:Split(","c)以逗号区分遍历字符串数组

    学习中遇到同一用户多种职业的情况,因为所有的数据都是从Excel里面取的,所以只能把所有的职业写在一个单元格里,以逗号区分. 那么就需要先把字符串转为数组,然后遍历数组去添加职位.如图 Split(& ...

  5. java web问题总结

    1.java web上传附图页面空,无返回 原因:前端页面与后台端口不一致,无页面可返回 2.上传excel导入数据时,只能导入第一条,后面的数据无法导入,缓存设置过小.

  6. uiautomator 安装和升级

    1.打开uiautomator sdk安装路径 < tools < uiautomatorviewer.bat # 双击点开 2.升级uiautomator包 1.uiautomatorv ...

  7. VIJOS-P1325 桐桐的糖果计划

    VIJOS-P1325 桐桐的糖果计划 JDOJ 1432 桐桐的糖果计划 https://neooj.com/oldoj/problem.php?id=1432 Description 桐桐很喜欢吃 ...

  8. [LeetCode] 75. Sort Colors 颜色排序

    Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...

  9. Circumference of circle

    public class Solution { public static void main(String[] args) { Scanner ip = new Scanner(System.in) ...

  10. oracle--18C操作指南(一)

    一,安装清单 用户环境配置 查看Oracle Inventory(oraInventory)和OINSTALL组要求 您指定为Oracle Inventory目录的物理组是系统上安装的Oracle软件 ...