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. 简介 协议 下载 源码 必要的软件 ...
随机推荐
- Oracle client 安装、配置
一.安装 链接: https://pan.baidu.com/s/1Yph6hiNkCJsApAzu_Vx2ew 提取码: r9ye 二.配置 1.控制面板\所有控制面板项\管理工具\数据源(ODB ...
- jenkins构建前端Vue
最近做项目,使用了前后端分离,后端代码是用maven构建的,前端之前没有了解过, 和开发稍微沟通了一下,开发提供了非常有用的信息, 只要搜索关键字 jenkins 构建 Vue,按照步骤操作,果然编译 ...
- Nginx 初步认识
序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也 ...
- 树莓派搭建SVN服务器
1.安装SVN服务器 sudo apt-get install subversion -y 2.创建仓库 mkdir /home/pi/svnRepository svnadmin create /h ...
- E08【选尺码】I'm looking for size 43
核心句型 I'm looking for size 43 我想要43号的 场景对话 A:Can I help you?您需要什么? B:Yes,can I try on those shoes,ple ...
- day22_7.26面向对象之封装(接口与抽象)
一.封装. 封装就是将丑陋复杂的隐式的细节隐藏到内部,对外提供简单的使用接口. 对外隐藏内部实现细节,并提供访问的接口.对内使用self操作. 二.为什么要封装? 对于一个计算机来说,不可能不使用机箱 ...
- centos7 扩容
用 df -h, 看到磁盘满了 (注意:如果是二,或者第三次扩容,下面的参数就不一样) fdisk /dev/sda 但是失败了,显示没有多余的分区 可以看到 有个/dev/sda4 是我在这之前刚刚 ...
- 团队冲刺---Four
今天的计划: 研究css模板. 昨天做了什么: 寻找css模板,研究界面布局. 遇到的问题: css模板,代码看不太懂,好多标签都不会用.
- c:forTokens标签循环输出
对带有相同符合格式内容进行分割输出,例如,varstr="1,2,3,4,5,6"; c:forTokens属性说明表 引用 varStatus,它们描述了迭代的当前状态,如下这些 ...
- 牛客CSP-S提高组赛前集训营2 ———— 2019.10.31
比赛链接 期望得分:100+20+20 实际得分:40+20+30 awa cccc T1 :基于贪心的思路,然后开始爆搜(雾 那必然是会死的,好吧他就是死了 #include<iostrea ...