Winform c# 多线程处理实例
我们在用C# 开发程序时,经常会使用的多线程,实现多任务的处理。一般常用的方法是新建多个线程,进行处理。
今天我分享一个采用线程池的方式来实现的实例。对有需要的朋友做个借鉴。
实例: Winform
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using System.Threading;
- namespace MultiThreading
- {
- /// <summary>
- /// 此实例:为SDP软件快速开发平台中使用到的真实方法
- /// </summary>
- public partial class Form1 : Form
- {
- /// <summary>
- /// 私有:线程同步信号
- /// </summary>
- private ManualResetEvent cmdWaiter;
- /// <summary>
- /// 委托更新进度条
- /// </summary>
- private delegate void updateBar();
- /// <summary>
- /// 结束提示委托
- /// </summary>
- private delegate void showEnd();
- /// <summary>
- /// 任务队列
- /// 注意:此任务队列 需要用户自动来定义
- /// 实例中采用 string 来处理
- /// </summary>
- private List<string> taskList = new List<string>();
- /// <summary>
- /// 构造函数
- /// </summary>
- public Form1()
- {
- InitializeComponent();
- }
- /// <summary>
- /// 页面初始化加载
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void Form1_Load(object sender, EventArgs e)
- {
- // 阻塞当前线程
- cmdWaiter = new ManualResetEvent(false);
- // 启动线程池
- ThreadPool.QueueUserWorkItem(new WaitCallback(this.On_ThreadEvent));
- }
- /// <summary>
- /// 线程处理事务
- /// </summary>
- /// <param name="obj"></param>
- private void On_ThreadEvent(object obj)
- {
- while (true)
- {
- try
- {
- // 阻塞当前线程,等待解除指令
- this.cmdWaiter.WaitOne();
- // 执行我们需要处理的事务
- for (int k = ; k < taskList.Count; k++)
- {
- Run_MyBusiness(taskList[k]);
- // 休息指定的毫秒
- Thread.Sleep();
- }
- // 清除队列数据
- this.taskList.Clear();
- this.On_EndLog();
- this.cmdWaiter.Reset();
- }
- catch (Exception e)
- {
- string strError = e.Message.ToString();
- this.taskList.Clear();
- this.cmdWaiter.Reset();
- }
- }
- }
- /// <summary>
- /// 执行我们自己的业务
- /// </summary>
- /// <param name="str"></param>
- private void Run_MyBusiness(string str)
- {
- // 委托更新
- updateBar updateDelegate = new updateBar(On_Update);
- this.Invoke(updateDelegate);
- }
- /// <summary>
- /// 开始按钮
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void btn_Start_Click(object sender, EventArgs e)
- {
- this.taskList = new List<string>();
- for (int i = ; i < ; i++)
- {
- this.taskList.Add(i.ToString());
- }
- this.txt_log.Text = "开始:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine;
- this.pg_Bar.Value = ;
- this.pg_Bar.Maximum = this.taskList.Count;
- // 解除阻塞
- this.cmdWaiter.Set();
- }
- /// <summary>
- /// 更新进度条
- /// </summary>
- private void On_Update()
- {
- this.pg_Bar.Value = this.pg_Bar.Value + ;
- }
- private void On_EndLog()
- {
- showEnd endDeg = new showEnd(On_UpdateTextBox);
- this.Invoke(endDeg);
- }
- private void On_UpdateTextBox()
- {
- string runStr = "结束:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- this.txt_log.Text = this.txt_log.Text + runStr;
- }
- }
- }
运行效果:
下载地址:多线程实例 DEMO
Winform c# 多线程处理实例的更多相关文章
- 通过GUID确保winform运行唯一实例
通过程序生成的GUIDwinform唯一实例 using System.Threading;bool createdNew; Guid ownGUID = new Guid(((GuidAttribu ...
- WinForm 登录窗体 + 单实例运行
关于怎么在winform里增加登录窗体或者如何让winform程序单实例运行网上都很多例子. 然而两者结合起来呢? //Program.cs static class Program { public ...
- 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web
实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义—请假申请流程-Web 参考文章: RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系 ...
- WinForm查询大数据界面假死,使用异步调用解决
用DataGridView无分页绑定一个几千条数据的查询,查询的时候界面直接卡死十几秒,用户体验非常不好,因此用异步操作解决界面卡死的问题原本场景:点击[查询]后,界面直接卡死优化场景:点击[查询]后 ...
- [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二)
上一节链接:http://www.cnblogs.com/zjutlitao/p/4116783.html 前言: 在上一节中我们已经大致介绍了该软件的是什么.可以干什么以及界面的大致样子.此外还详细 ...
- C#源码500份
C Sharp 短信发送平台源代码.rar http://1000eb.com/5c6vASP.NET+AJAX基础示例 视频教程 http://1000eb.com/89jcC# Winform ...
- 2013年7月份第3周51Aspx源码发布详情
批量重命名文件工具源码 2013-7-19 [VS2010]功能介绍:这是一个新型的文件重命名,主要用了TreeView(树形视图)来选择文件夹,批量进行文件重命名.其中,有"编号在前,编 ...
- JavaScript导航树
JS导航树 整理之前的小代码片段,放到博客,便于以后完善查看: 该JS导航树实际效果,[GSP+社区网站专题课程页面导航树]地址:http://gsp.inspur.com/knowledge/zhu ...
- 最近学习工作流 推荐一个activiti 的教程文档
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...
随机推荐
- k8s Ingress和ingress控制器
ingress架构图简介 我们知道service的表现形式为IP:PORT,即工作在第四层传输层(TCP/IP层),那么对于不同的URL地址经常对应用不同的后端服务或者虚拟服务器,这些应用层的转发机制 ...
- [TCP/IP] TCP的重发机制是怎么实现的
1)滑动窗口机制,确立收发的边界,能让发送方知道已经发送了多少(已确认).尚未确认的字节数.尚待发送的字节数:让接收方知道(已经确认收到的字节数) 2) 超时重传,tcp每发送一个报文段,就设置一次计 ...
- DNS分离解析
实验环境: 一台内网(client)1块网卡:一台网关(dns)2块网卡:一台外网1块网卡 DNS服务器开启路由转发 [root@localhost ~]# vi /etc/sysctl.conf n ...
- UiPath:Split(","c)以逗号区分遍历字符串数组
学习中遇到同一用户多种职业的情况,因为所有的数据都是从Excel里面取的,所以只能把所有的职业写在一个单元格里,以逗号区分. 那么就需要先把字符串转为数组,然后遍历数组去添加职位.如图 Split(& ...
- java web问题总结
1.java web上传附图页面空,无返回 原因:前端页面与后台端口不一致,无页面可返回 2.上传excel导入数据时,只能导入第一条,后面的数据无法导入,缓存设置过小.
- uiautomator 安装和升级
1.打开uiautomator sdk安装路径 < tools < uiautomatorviewer.bat # 双击点开 2.升级uiautomator包 1.uiautomatorv ...
- VIJOS-P1325 桐桐的糖果计划
VIJOS-P1325 桐桐的糖果计划 JDOJ 1432 桐桐的糖果计划 https://neooj.com/oldoj/problem.php?id=1432 Description 桐桐很喜欢吃 ...
- [LeetCode] 75. Sort Colors 颜色排序
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...
- Circumference of circle
public class Solution { public static void main(String[] args) { Scanner ip = new Scanner(System.in) ...
- oracle--18C操作指南(一)
一,安装清单 用户环境配置 查看Oracle Inventory(oraInventory)和OINSTALL组要求 您指定为Oracle Inventory目录的物理组是系统上安装的Oracle软件 ...