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#:简单线程样例的更多相关文章

  1. JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例

    什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MS ...

  2. Introspector(内省)简单演示样例 与 简单应用

    简单演示样例: package com.asdfLeftHand.test; import java.beans.BeanDescriptor; import java.beans.BeanInfo; ...

  3. Thrift的安装和简单演示样例

    本文仅仅是简单的解说Thrift开源框架的安装和简单使用演示样例.对于具体的解说,后面在进行阐述. Thrift简述                                           ...

  4. [hadoop系列]Pig的安装和简单演示样例

    inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).(来源:http://blog.csdn.net/inkfish) Pig是Yaho ...

  5. 一则简单演示样例看Oracle的“无私”健壮性

    Oracle的强大之处就在于他能总帮助让你选择正确的运行计划,即使你给了它错误的指示. 实验: 1. 创建測试表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...

  6. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  7. Android中关于JNI 的学习(零)简单的样例,简单地入门

    Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...

  8. Android通过startService播放背景音乐简单演示样例

    关于startService的基本使用概述及其生命周期可參见博客<Android中startService的使用及Service生命周期>. 本文通过播放背景音乐的简单演示样例,演示sta ...

  9. 使用CEF(二)— 基于VS2019编写一个简单CEF样例

    使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...

随机推荐

  1. SQL将一张表中的数据插入到另一张表

    将表T_wz_wz中的部分数据插入到表t_wz_kc: ,,'Y' from t_wz_wz where yxbz='Y' --去重复 -- and wzid not in (select wzid ...

  2. cocos2dx 3.x(点击屏幕移动精灵,拖动精灵)不需要写回调函数Lua表达式

    // // MainScene.cpp // helloworld // // Created by apple on 16/9/19. // // #include "MainScene. ...

  3. iphone尺寸设计

    http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions http://daily.zhihu.com/story/4 ...

  4. C++Primer 第十二章

    //1.标准库提供了两种智能指针类型来管理动态对象,均定义在头文件memory中,声明在std命名空间. // shared_ptr:允许多个指针指向同一个对象. // unique_ptr:独占所指 ...

  5. CheckBox的用法

    if (window.pageConfig["IsCommend"] == "True") {      $("#IsCommend").v ...

  6. MySQL部分1

    MySQL有三个层次 1.文件层次:放在硬盘上存东西的  必须要放在硬盘上 2.服务层次:必须要通过MySQL这个服务才能操作里面哪个内容 3.界面层次:默认不提供界面,需要安装navicat8(界面 ...

  7. ofbiz进击 第四节。 我的form之旅

    一般使用ofbiz做后台管理的时候,多数会使用ofbiz的form去做后台.下面我就总结下我在使用form的时候的一些总结与问题吧. 1.首先,我们看如何使用最简单form去查询某个单个的对象,并对其 ...

  8. 常见http代码错误原因及处理

    常见的HTTP错误可以分为以下四大类.每一大类又细分为很多类小错误.当您打不开网站或者打开网站报错时首先检查您输入的网站是否有误,检查网络是否有问题或者虚拟主机的DNS是否可以解析.确定没有问题时再看 ...

  9. paper 39 :Matlab绘制误差棒图(errorbar函数的使用)

    同很多非数学相关专业的朋友一样,我第一次碰到这个图时也是丈二和尚摸不着头脑.只知道这个工字型的图案,中间的点代表的是平均值,上下的两条横线代表的是方差值,除此之外,连这个图叫什么名字都不知道,只好硬着 ...

  10. 夺命雷公狗ThinkPHP项目之----企业网站3之后台栏目页的搭建(百度编辑器的引入)

    我们现在就开始搭建我们的后台栏目页的后台了: 首先创建一个CategoryController.class.php的控制器,让列表页和添加页面显示出来先: 然后就是开始动手修改我们的视图部分了: 我们 ...