C#:简单线程样例
1、定义线程类及内部事件
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Windows.Forms; namespace ThreadSample
{
public delegate void ThreadEventHandler(object sender, EventArgs e);
public class myThread
{
//线程执行开始调用事件
public event ThreadEventHandler RequestEvent;
//线程执行结束调用事件
public event ThreadEventHandler CompletedEvent;
//是否允许执行线程中具体任务
public bool isExecute = false;
//线程名称
private string threadName = "线程"; //string.Empty;
public string ThreadName
{
get { return threadName; }
} public void Start()
{
try
{
//执行前调用事件
RequestEvent(this, null);
if (isExecute)
{
//执行任务
Random seed = new Random(DateTime.Now.Millisecond);
int sleepTime = seed.Next(, );
Thread.Sleep(sleepTime);
} threadName += Thread.CurrentThread.ManagedThreadId.ToString(); //执行后调用事件
CompletedEvent(this, null);
}
catch (Exception ex)
{
//记录错误日志追踪文件
}
}
}
}
2、在外部调用线程,并添加线程事件内容,及其监视器实现同步
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 ThreadSample
{ public partial class frmApp : Form
{
public frmApp()
{
InitializeComponent();
} private void btnExit_Click(object sender, EventArgs e)
{
Environment.Exit();
} private void btnRun_Click(object sender, EventArgs e)
{
try
{
int threadCount = ;
this.tbMonitor.Clear(); //显示监视线程的信息
myThread[] threadArray = new myThread[threadCount];
Thread td = null;
for (int i = ; i < threadCount; i++)
{
threadArray[i] = new myThread();
threadArray[i].RequestEvent += frmApp_RequestEvent;
threadArray[i].CompletedEvent += frmApp_CompletedEvent;
td = new Thread(threadArray[i].Start);
td.Start();
}
}
catch (Exception ce)
{
MessageBox.Show(ce.ToString());
}
} //记录线程信息
private delegate void RecordsEventHandler(object sender, EventArgs e); //依据线程调用次方法的先后显示信息
private void frmApp_CompletedEvent(object sender, EventArgs e) //sender太泛,可以给准确名字(myThread)
{
if (this.tbMonitor.InvokeRequired)
{
this.tbMonitor.Invoke(new RecordsEventHandler(frmApp_CompletedEvent), new object[] { sender, e });
}
else
{
try
{
Monitor.Enter(this.tbMonitor); //同步机制,指定对象获取排它锁 //具体操作
this.tbMonitor.Text += (sender as myThread).ThreadName + "--- ---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffff ") + Environment.NewLine; }
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
//记录错误日志追踪文件
}
finally
{
Monitor.Exit(this.tbMonitor); //同步机制,指定对象释放排它锁
}
}
} private void frmApp_RequestEvent(object sender, EventArgs e)
{
//是否允许执行线程中具体任务
(sender as myThread).isExecute = true;
}
}
}
注意:监视器实现同步的对象是否必须调用Invoke()方法。
C#:简单线程样例的更多相关文章
- JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例
什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MS ...
- Introspector(内省)简单演示样例 与 简单应用
简单演示样例: package com.asdfLeftHand.test; import java.beans.BeanDescriptor; import java.beans.BeanInfo; ...
- Thrift的安装和简单演示样例
本文仅仅是简单的解说Thrift开源框架的安装和简单使用演示样例.对于具体的解说,后面在进行阐述. Thrift简述 ...
- [hadoop系列]Pig的安装和简单演示样例
inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).(来源:http://blog.csdn.net/inkfish) Pig是Yaho ...
- 一则简单演示样例看Oracle的“无私”健壮性
Oracle的强大之处就在于他能总帮助让你选择正确的运行计划,即使你给了它错误的指示. 实验: 1. 创建測试表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...
- scrapy爬虫学习系列二:scrapy简单爬虫样例学习
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- Android中关于JNI 的学习(零)简单的样例,简单地入门
Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...
- Android通过startService播放背景音乐简单演示样例
关于startService的基本使用概述及其生命周期可參见博客<Android中startService的使用及Service生命周期>. 本文通过播放背景音乐的简单演示样例,演示sta ...
- 使用CEF(二)— 基于VS2019编写一个简单CEF样例
使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...
随机推荐
- 第九篇 SQL Server安全透明数据加密
本篇文章是SQL Server安全系列的第九篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...
- IIS应用程序池添加ASP.NET v4.0
可能在安装.NET Framewrok 4.0之前,IIS就已经装好了,结果在IIS的应用程序池中只有.NET 2.0的Classic .NET AppPool和DefaultAppPool.在使用v ...
- javascript表单操作方法
一.Form元素 相关属性: 1,action属性 2,elements属性 3,length属性 4,name属性 5, method属性 如果多个表单字段的name属性相同,那么提交的value就 ...
- 使用IXmlSerializable的问题
最近又开始使用XML了,但今天遇到一个折腾我一下午加一个晚上的时间,终于从网络上找到相关的资料解决了. 有一个成员是用来存放正则表达式的,由于里面包含其它字符,所以想用CDATA来保存方便查看,所以想 ...
- Excel将秒转换成标准的时间格式HH:MM:SS
Excel将秒转换成标准的时间格式HH:MM:SS 比如120秒,转换成00:02:00 Excel公式为: =TEXT(A1/86400,"[hh]:mm:ss") A1为秒数据 ...
- UIStackView入门
http://www.cocoachina.com/ios/20150623/12233.html
- 2-sat按照最小字典序输出可行解(hdu1814)
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hduoj 4706 Herding 2013 ACM/ICPC Asia Regional Online —— Warmup
hduoj 4706 Children's Day 2013 ACM/ICPC Asia Regional Online —— Warmup Herding Time Limit: 2000/1000 ...
- 背包九讲 附:USACO中的背包问题
附:USACO中的背包问题 USACO是USA Computing Olympiad的简称,它组织了很多面向全球的计算机竞赛活动. USACO Trainng是一个很适合初学者的题库,我认为它的特色是 ...
- Ruby调用Excel相关的函数
require 'win32ole'myexcel = WIN32OLE.new("excel.application")#WIN32OLE.open 方法打开用例文件,用Call ...