/// <summary>
/// 多线程执行
/// </summary>
public class MultiThreadingWorker
{
/// <summary>
/// 确保线程全部完成
/// </summary>
private Done m_done = null;
private long m_startTime = ;
private Queue m_workload = null; public MultiThreadingWorker()
{
m_done = new Done();
m_workload = new Queue();
} /// <summary>
/// 线程工作的内容委托
/// </summary>
public WorkContent workContent { get; set; }
/// <summary>
/// 线程数目
/// </summary>
public int threadCount { get; set; } private bool m_quit;
public bool Quit
{
get { return m_quit; }
set { m_quit = value; }
}
/// <summary>
/// 增加工作的对象到队列
/// </summary>
/// <param name="work"></param>
public void AddWork(Object work)
{
Monitor.Enter(this);
m_workload.Enqueue(work);
Monitor.Pulse(this);
Monitor.Exit(this);
}
/// <summary>
/// 从队列中取出对象
/// </summary>
/// <returns></returns>
private Object ObtainWork()
{
Monitor.Enter(this);
while (m_workload.Count < )
{
Monitor.Wait(this);
}
Object next = m_workload.Dequeue(); Monitor.Exit(this);
return next;
} /// <summary>
/// 开始执行
/// </summary>
public void Start()
{
m_startTime = System.DateTime.Now.Ticks;
m_done.Reset();
m_quit = false; for (int i = ; i <= threadCount; i++)
{
ThreadStart ts = new ThreadStart(this.Process);
Thread m_thread = new Thread(ts);
m_thread.Start();
} m_done.WaitBegin();
m_done.WaitDone();
} /// <summary>
/// 停止执行
/// </summary>
public void Stop()
{
m_quit = true;
} private void Process()
{
while (m_quit==false)
{
Object workobj = ObtainWork();
m_done.WorkerBegin();
try
{
workContent(workobj);
}
catch (Exception e)
{
System.Console.WriteLine(" Error:" + e.Message);
}
finally
{
m_done.WorkerEnd();
}
}
}
} /// <summary>
/// 执行内容适用委托
/// </summary>
/// <param name="work"></param>
public delegate void WorkContent(Object work); public class Done
{
private int m_activeThreads = ;
private bool m_started = false; public void WaitDone()
{
Monitor.Enter(this);
while ( m_activeThreads> )
{
Monitor.Wait(this);
}
Monitor.Exit(this);
} public void WaitBegin()
{
Monitor.Enter(this);
while ( !m_started )
{
Monitor.Wait(this);
}
Monitor.Exit(this);
} /// <summary>
/// 执行开始
/// </summary>
public void WorkerBegin()
{
Monitor.Enter(this);
m_activeThreads++;
m_started = true;
Monitor.Pulse(this);
Monitor.Exit(this);
} /// <summary>
/// 执行完成
/// </summary>
public void WorkerEnd()
{
Monitor.Enter(this);
m_activeThreads--;
Monitor.Pulse(this);
Monitor.Exit(this);
} /// <summary>
/// 重新初始化
/// </summary>
public void Reset()
{
Monitor.Enter(this);
m_activeThreads = ;
Monitor.Exit(this);
}
}

调用代码:

public class TestMultiThreading
{
public static void Test()
{
MultiThreadingWorker thWork = new MultiThreadingWorker();
thWork.threadCount = ;
thWork.workContent = new WorkContent(WorkFun);
for (int i = ; i < ; i++)
thWork.AddWork(i);
thWork.Start();
} private static void WorkFun(object obj)
{
Console.WriteLine("执行内容:" + obj.ToString());
}
}

C#多线程管理代码的更多相关文章

  1. OC多线程管理

    在OC中多线程管理包含GCD.NSThread.NSOperationQueue. 下面简单介绍. 进程和线程 进程:正在进行中的程序叫做进程,负责程序运行的内存分配. 每一个进程都有自己独立的虚拟内 ...

  2. 理解多线程管理类 CWorkQueue

    有些人会觉得多线程无非是,有多少任务就启动多少线程,CreadThread,执行完了自己结束就释放资源了,其实不然.多线程是需要管理的,线程的启动.执行.等待和结束都需要管理,线程间如何通信,如何共享 ...

  3. ios 开发中使用SVN管理代码

    今天新公司需要使用SVN管理代码,就在网上查看相关的资料,现在把相关用法记录下来: 1.使用的是这个软件Cornerston 网上有很多相应的下载链接,可以去查看 2.下载安装之后,首先需要添加仓库r ...

  4. java 22 - 9 多线程之 代码实现的方式2

    多线程的代码实现: 方式2:实现Runnable接口 步骤: A:自定义类MyRunnable实现Runnable接口 B:重写run()方法 C:创建MyRunnable类的对象 D:创建Threa ...

  5. 使用GIT来管理代码的心得

    使用GIT来管理代码,第一步当然就是下载一个GIT客户端(不知道是不是这么叫,但是觉得和客户端的功能差不多).电脑的操作系统是windows7的,所以下的是对应的GIT. 就是这玩意,安装的时候不停的 ...

  6. github的初次体验及管理代码的心得

    周六早上的课上,助教给我们演示了一遍如何上传和下载代码库,新建代码库等等,但是是在linux上的,而我的笔记本的操作系统是win7的.而在教室中的尝试因为网络原因,虽然可以上github的网站,但是下 ...

  7. 用开源中国(oschina)Git管理代码(整合IntelliJ 13.1.5)

    简介 开源中国提供了Git服务(地址:http://git.oschina.net/),在速度上比国外的github要快很多.使用了一段时间,感觉很不错.oschina git提供了演示平台,可以运行 ...

  8. 使用git建立本地仓储管理代码【转】

    转自:http://blog.csdn.net/airk000/article/details/7738231 Git是Linus大神的代码管理工具,简直说是开发者的超级福音,而作为屌丝的个人开发者, ...

  9. JAE京东云引擎Git上传管理代码教程和京东云数据库导入导出管理

    文章目录 Git管理准备工作 Git工具上传代码 发布代码装程序 mywebsql管理 京东云引擎小结   JAE京东云引擎是京东推出的支持Java.Ruby.Python.PHP.Node.js多语 ...

随机推荐

  1. C#与数据库访问技术总结(十七)

    使用DataSet对象访问数据库 当对DataSet对象进行操作时,DataSet对象会产生副本,所以对DataSet里的数据进行编辑操作不会直接对数据库产生影响,而是将DataRow的状态设置为ad ...

  2. atitit.api设计 方法 指南 手册 v2 q929.docx

    atitit.api设计 方法 指南 手册 v2 q929.docx atitit.api设计原则与方法 1. 归一化(锤子钉子理论)1 1.1. 链式方法2 1.2. 规则5:建立返回值类型2 1. ...

  3. spring源码 — 一、IoC容器初始化

    IoC容器初始化 注意:本次的spring源码是基于3.1.1.release版本 容器:具有获取Bean功能--这是最基本功能,也是BeanFactory接口定义的主要行为,在添加了对于资源的支持之 ...

  4. curl常用操作

    1.cURL介绍 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 cURL 库.本文将介绍 cURL 的一些高级特性 ...

  5. android: 文件存储

    数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑 关机的情况下,这些数据仍然不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在 存储设备中的数据是处于持久状态的,持久化 ...

  6. 什么是automatic variable?

    看代码符号$?搞不清楚是什么?   看代码. $share = Get-WmiObject -Class Win32_Share -ComputerName $Server.name -Credent ...

  7. Hermes实时检索分析平台

    一.序言 随着TDW的发展,公司在大数据离线分析方面已经具备了行业领先的能力.但是,很多应用场景往往要求在数秒内完成对几亿.几十亿甚至几百上千亿的数据分析,从而达到不影响用户体验的目的.如何能够及时有 ...

  8. VB中WinSock控件的属性、方法、事件及应用

    一.WinSock简介       Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的 ...

  9. Grunt 新手指南

    导言 作为一个正在准备从java 后端转大前端,一直都有想着,在js 的世界里面有没有类似于maven或者gradle 的东西..然后,就找到了grunt 这玩意 Grunt是用来干什么的 诸如ant ...

  10. Linux--Ubuntu12.04安装NDK

    前言 本篇博客将介绍如何在Ubuntu12.04下安装Android NDK,在其他版本的Ubuntu下,方法也类似.由于Android NDK不能单独作为Android应用程序来运行,因此,使用An ...