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. 简介 协议 下载 源码 必要的软件 ...
随机推荐
- javascript加载XML字符串或文件
1. 加载XML文件 方法1:ajax方式.代码如下: var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObje ...
- Window包管理工具scoop
自定义安装路径安装 scoop安装应用路径 目标目录是D:\Program Files\Scoop,在PowerShell命令控制台中运行: [environment]::setEnvironment ...
- CF1193A Amusement Park
洛谷 CF1193A Amusement Park 洛谷传送门 题目翻译 有一个游乐场有一个好玩的项目:一些有向滑梯可以将游客从一个景点快速.刺激地传送到另一个景点.现在,你要帮游乐场老板来规划一个造 ...
- Leetcode61.旋转链表
链表中的点已经相连,一次旋转操作意味着: 先将链表闭合成环 找到相应的位置断开这个环,确定新的链表头和链表尾 class Solution{ public: ListNode* rotateRight ...
- JavaScript中的回调函数(callback)
什么是回调函数 In computer programming, a callback is a piece of executable code that is passed as an argum ...
- 在springboot中使用redis缓存,将缓存序列化为json格式的数据
背景 在springboot中使用redis缓存结合spring缓存注解,当缓存成功后使用gui界面查看redis中的数据 原因 springboot缓存默认的序列化是jdk提供的 Serializa ...
- 手机爬虫--appium
adb 安装:下载android-sdk压缩包,解压后其中有adb.exe,配置环境变量后即可 cmd下'adb'即可启动adb客户端 adb devices –l 查看已连接的模拟器 adb co ...
- Layui 文件上传 附带data数据
配置项中增加参数: , data: { CaseId: function () { return $("#CaseId option:selected").val(); }, Ca ...
- 【转】为什么要重写hashcode()方法和toString()方法
Object 类 包含toString()和hashCode()方法. 一.toString(): 在Object类里面定义toString()方法的时候返回的对象的哈希code码,这个hashcod ...
- Ubuntu放弃战斗, Linux桌面的悲哀 - 简书
Ubuntu放弃战斗, Linux桌面的悲哀 - 简书 https://www.jianshu.com/p/86dd6e34ce91