/// <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. 免费好用的web应用托管平台-续

    上一篇博客给大家推荐了目前处于免费阶段的PAAS平台,可以托管各种应用,大家反响很不错,说明大家还是很需要和认可这个免费托管各种web应用的京东云擎平台.但是很多用户还是很担心未来可能还是会收费,对于 ...

  2. mysql 密码重置

    1.停止mysql服务(以管理员身份,在cmd命令行下运行) net stop mysql 2.使用命令启动mysql数据库,跳过权限验证 mysqld -nt --skip-grant-tables ...

  3. [Python爬虫] Selenium+Phantomjs动态获取CSDN下载资源信息和评论

    前面几篇文章介绍了Selenium.PhantomJS的基础知识及安装过程,这篇文章是一篇应用.通过Selenium调用Phantomjs获取CSDN下载资源的信息,最重要的是动态获取资源的评论,它是 ...

  4. 如何启动/停止/重启MySQL

    启动.停止.重启 MySQL 是每个拥有独立主机的站长必须要撑握的操作,下面为大家简单介绍一下操作方法: 一.启动方式 1.使用 service 启动:service mysqld start 2.使 ...

  5. iOS僵尸对象之研究

    Zombie Objects对象研究 一.Xcode 关闭ARC project -> Build settings  搜索 Automatic Reference Counting       ...

  6. Sublime Text 设置文件详解

     Sublime Text 2是那种让人会一眼就爱上的编辑器,不仅GUI让人眼前一亮,功能更是没的说,拓展性目前来说也完全够用了,网上介绍软件的文章和推荐插件的文章也不少,而且很不错,大家可以去找找自 ...

  7. atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria

    atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria 1. 关键字 1 2. 统计功能框架普通有有些条件选项...一个日期选项..一个日期类型(日,周,月份 ...

  8. paip.检测信用卡账单数据的正确性算法

    paip.检测信用卡账单数据的正确性算法 主要3点: //1.重点检测.大钱记录 //2.检测遗漏记录 //3.排除双唇记录. //4.试着cls share,改变错误的cls. 作者Attilax ...

  9. Django模板系统

    创建模板对象Template类在django.template模板中 // 用django-admin.py startproject 命令创建一个项目目录django-admin.py startp ...

  10. WindowsPhone-GameBoy模拟器开发六--[转]指令系统实现必读:补码

    网上有同行写了些好文章,在此就不现丑了,贴上连接,放在这里为了补充系列的完整性 计算机为什么选用二进制补码 为什么补码重要?因为计算机中内存.寄存器里面存的数都是用补码表示的!