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. RFS_点击button按钮之后,RFS出现卡死的问题

    [html代码] <html> <head> <title> 主窗口 </title> </head> <body> <d ...

  2. [转] [环境搭建] VS-Visual Studio-IIS Express 支持局域网访问

    ------------------------------------------- 更正, 我发现Program一项只设置为iisexpress.exe是不可行的. 只能设置为Any才行(当然这是 ...

  3. 清除UIWebView的缓存

    //清除cookies NSHTTPCookie *cookie; NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCook ...

  4. Azure Reserved IP

    Azure PowerShell > Add-AzureAccount> Select-AzureSubscription "SubscriptionName"> ...

  5. SweetAlert2 使用教程

    SweetAlert2是一款功能强大的纯Js模态消息对话框插件.SweetAlert2用于替代浏览器默认的弹出对话框,它提供各种参数和方法,支持嵌入图片,背景,HTML标签等,并提供5种内置的情景类, ...

  6. mysql management note

    related url : http://willvvv.iteye.com/blog/1563345 http://lxneng.iteye.com/blog/451985    这篇文章对vari ...

  7. Java NIO 读数据处理过程

    这两天仿hadoop 写java RPC框架,使用PB作为序列号工具,在写读数据的时候遇到一个小坑.之前写过NIO代码,恰好是错误的代码产生正确的逻辑,误以为自己写对了.现在简单整理一下. 使用NIO ...

  8. J2EE maven pom.xml常用的jar包

    新建一个maven webapp工程,默认的pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  9. C# Enum Type

    class Program { public enum TimeOfDay { Morining, Afternoon, Evening } static void Main(string[] arg ...

  10. SQL事物

    事务:保障流程的完整执行就像银行取钱,先在你账上扣钱,然后存入别人的账上:但是从你账上扣完钱了,突然网断了,对方没有收到钱,那么此时你的钱也没了,别人的钱也没加上,为了防止此类情况的出现,事务. be ...