/// <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. 无线客户端框架设计(4):自定义生命周期的设计(iOS篇)

    首先要确定一点,我们的App,要基于XIB文件进行编程,而不是在每个相应的ViewController里面去手动创建页面的每个控件.这样做的好处是,将页面布局与业务逻辑彻底隔离.于是我们可以把xib的 ...

  2. [BTS] Deploy Command

    BizTalkDeploymentTools.AddResource.bat @Echo OFF SET ApplicationName=%~1 SET ComponentType=%~2 SET C ...

  3. java web图片显示到浏览器

    今天研究了一下午,图片显示问题. jsp中获取绝对路径的方法:String contextPath = request.getContextPath();String path = request.g ...

  4. SQL order by的用法

    首先,order by是用来写在where之后,给多个字段来排序的一个DQL查询语句. 其次,order by写法: 1.  select 字段列表/* from 表名 where 条件 order ...

  5. [读书笔记]C#学习笔记六: C#3.0Lambda表达式及Linq解析

    前言 最早使用到Lambda表达式是因为一个需求:如果一个数组是:int[] s = new int[]{1,3,5,9,14,16,22};例如只想要这个数组中小于15的元素然后重新组装成一个数组或 ...

  6. paip. java的 函数式编程 大法

    paip. java的 函数式编程 大法 Java 语言中常被忽视的一个方面是它被归类为一种命令式(imperative)编程语言.命令式编程虽然由于与 Java 语言的关联而相当普及,但是并不是惟一 ...

  7. CSS实现特殊效果

    CSS实现三道杠效果 http://jsbin.com/hocopusuvi/edit?html,css,output CSS实现圆点效果 http://jsbin.com/nojiromaje/ed ...

  8. Leetcode-122 Best Time to Buy and Sell Stock II

    #122  Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the pric ...

  9. Linux内核--异常和中断的区别

          相信大家都知道非常著名的两个名词:异常和中断,不过,你真的理解这两个名词在说什么吗?它们之间有什么区别呢?       1.中断       大家都知道,当我们在敲击键盘的同时就会产生中断 ...

  10. FTP客户端上传下载Demo实现

    1.第一次感觉MS也有这么难用的MFC类: 2.CFtpFileFind类只能实例化一个,多个实例同时查找会出错(因此下载时不能递归),采用队列存储目录再依次下载: 3.本程序支持文件夹嵌套上传下载: ...