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. IE、chrome、火狐中如何调试javascript脚本

    1.  IE中点击"F12",在弹出页面中调试javascript脚本 2. chrome中点击"F12",在弹出页面中调试javascript脚本 3.  火 ...

  2. UILabel属性

    1.text:设置标签显示文本. 2.attributedText:设置标签属性文本. Ios代码 NSString *text = @"first"; NSMutableAttr ...

  3. iOS 导航控制器返回栈中的某一控制器

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  4. 离线下载Windows 调试符号 Symbols

    公司开发机没有不能连接到互联网.调试程序时那些Windows模块(如ntdll.dll)不能加载符号,而程序总是崩在这些模块里.想看一眼到底崩在了什么地方. 需要把对应的符号下载下来. 使用工具sym ...

  5. JS实现图片跟随鼠标移动

    在实现这个特效之前,需要了解JS中一个对象,event(事件对象),对,只需了解这一个对象.它的方法属性我不多说了,想详细了解的童鞋点击这里. 我们用到的只有这个对象的两个属性,clientX与cli ...

  6. Java基础之创建窗口——颜色和光标(TryWindow4)

    控制台程序. java.awt包中把SystemColor类定义为Color类的子类.SystemColor类封装了本机操作系统用于显示各种组件的标准颜色.如果要比较SystemColor值和Colo ...

  7. Java Servlet(二):servlet配置及生命周期相关(jdk7+tomcat7+eclipse)

    该篇文章记录了Servlet配置相关用法及Servlet在Servlet容器中生命周期方法. Tomcat是一个Servlet容器: 1.Servlet容器管理了Servlet的整个生命周期,并调用s ...

  8. nyist28大数阶乘

    http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们 ...

  9. android与后台请求的例子

    public static ClientResponse SendClientRequest(List<BasicNameValuePair> params){ ClientRespons ...

  10. 今天遇到的一个问题(windows的ssh客户端连接不到虚拟机Ubuntu)

    今天比较郁闷,想用windows上的ssh客户端连接虚拟机中的Ubuntu. 但是死活连不上,之前是能脸上的,所以比较郁闷. 我首先在windows上ping Ubuntu的ip地址,竟然发不了数据包 ...