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项目,逐步进 ...
随机推荐
- 第八篇 Integration Services:高级工作流管理
本篇文章是Integration Services系列的第八篇,详细内容请参考原文. 简介在前面两篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcu ...
- sqlserver 2000事务复制问题
2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长,不对之处欢迎指正. sqlserver 2000事务复制问题服务器A(发布) ...
- java对象占多少内存
通常来说Hotspot jvm的对内存中的对象由以下几个部分组成 一个对象头,包含了一些整理工作所需信息 原始类型字段,不同类型大小各异(表1) 引用字段,占据4个字节(byte) 填充,在对象的末尾 ...
- CRM 迁移服务器备忘
1. 安装IIS 2. 安装sqlexpress 2005, sql management studio express 3. 安装.net framework4.0 4. 安装filezilla S ...
- zip格式jdk在Linux环境下的安装过程
1下载jdk [root@localhost opt]# cd soft_bak/[root@localhost soft_bak]# lsjdk1.7.0_25.zip postgresql-9.4 ...
- Lintcode: Route Between Two Nodes in Graph
Given a directed graph, design an algorithm to find out whether there is a route between two nodes. ...
- application 统计网站访问人数
参考书<JSP Web 开发案例教程> index.jsp welcome.jsp 显示
-  |"|&|<|>等html字符转义
提示:请直接按CTRL+F搜索您要查找的转义字符. 原文地址:http://write.blog.csdn.net/postedit/8817826 常用表: No. 文字表記 10進表記 16 ...
- linux下利用nginx部署python网站
首先目标机器需要安装python nginx uwsgi,其次,需要给Nginx写配置文件,大体内容如下,具体内容可见 http://blog.cn2p.com/web-server/nginx-uw ...
- C++之路进阶——bzoj3524(Couriers)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser gryz2016 Logout 捐赠本站 Notice:由于本OJ ...