/// <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. IOS Storyboard使用-模拟登录、注册、混合使用

    最近分析IOS的占有率,发现5.0以下的少之又少了,故而决定新的App用 Storyboard开发,找了很多资料都是点上的,这个简单的demo是测试代码,发上来,供新手参考. 模拟登录.注册.和显示主 ...

  2. Js中的一个日期处理格式化函数

    由于在工作中,经常需要对日期进行格式化,不像后端那样,有方便的方法可调用,可以在date的对象prototype中定义一个format方法,见如下 //日期时间原型增加格式化方法 Date.proto ...

  3. python web框架——扩展Django&tornado

    一 Django自定义分页 目的:自定义分页功能,并把它写成模块(注意其中涉及到的python基础知识) models.py文件 # Create your models here. class Us ...

  4. Thinking in Java from Chapter 15

    From Thinking in Java 4th Edition. 泛型实现了:参数化类型的概念,使代码可以应用于多种类型.“泛型”这个术语的意思是:“适用于许多许多的类型”. 如果你了解其他语言( ...

  5. Struts2入门1 Struts2基础知识

    Struts2入门1 Struts2基础知识 20131130 代码下载: 链接: http://pan.baidu.com/s/11mYG1 密码: aua5 前言: 之前学习了Spring和Hib ...

  6. (谷歌浏览器等)解决css中点击input输入框时出现外边框方法【outline:medium;】

    问题:在使用谷歌浏览器,360浏览器时,点击input输入框会出现带颜色的外边框,如下图所示:

  7. Windows Server 2008 R2 备份和恢复 (转)

    Windows Server Backup : 1.安装Windows Server Backup的方法: 通过"服务器管理器"中的"添加功能"向导进行安装. ...

  8. Bitmap和Drawable相互转换方法

    很多开发者表示,不知道Android的Drawable和Bitmap之间如何相关转换.下面给大家两种比较简单高效的方法. 一.Bitmap转Drawable Bitmap bm=xxx; //xxx根 ...

  9. json字符串转成 Map/List

    package jsonToMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import n ...

  10. 如何查看Linux的系统是64位的还是32位的

    可以用命令“getconf LONG_BIT”查看,如果返回的结果是32则说明是32位,返回的结果是64则说明是64位. 此外还可以使用命令“uname -a”查看,输出的结果中,如果有x86_64就 ...