/// <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. Atitit.auto complete 自动完成控件的实现总结

    Atitit.auto complete  自动完成控件的实现总结 1. 框架选型 1 2. 自动完成控件的ioc设置 1 3. Liger  自动完成控件问题 1 4. 官网上的code有问题,不能 ...

  2. iOS -iPhone5、iPhone5s、iPhone6、iPhone6Plus 屏幕适配

    现在由于苹果公司出了6和6Plus,让写苹果程序的哥们为了做兼容很头疼.用StoryBoard固然方便,但是后期做兼容要花费太多的时间和精力.使用AutoLayout虽然会在不同尺寸的屏幕下自动布局, ...

  3. 配置editplus,讓其支持代碼自動格式化功能.

    使用editplus已經好多年了,累積了不少的東西,想換IDE比較麻煩,所以就研究了一下用editplus搭配gofmt.exe配置go語言代碼自動格式化的功能.還好功夫不負有心人,終於被我搞懂了,不 ...

  4. webRTC-实时流媒体的福音

    WebRTC是一项在浏览器内部进行实时视频和音频通信的技术,是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项技术.[1] WebRTC实现了基于网页的视频会议 ...

  5. Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

    一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...

  6. Android屏幕适配的一些常识

    屏幕适配的注意事项 1. AndroidManifest.xml设置 在中Menifest中添加子元素 android:anyDensity="true"时,应用程序安装在不同密度 ...

  7. MongoDB副本集配置系列九:MongoDB 常见问题

    What is a namespace in MongoDB? If you remove a document, does MongoDB remove it from disk? When doe ...

  8. IntelliJ IDEA + Maven环境编写第一个hadoop程序

    1. 新建IntelliJ下的maven项目 点击File->New->Project,在弹出的对话框中选择Maven,JDK选择你自己安装的版本,点击Next 2. 填写Maven的Gr ...

  9. [纯干货] MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  10. C#删除字符串最后一个字符的几种方法

    字符串:string s = "1,2,3,4,5,"目标:删除最后一个 "," 方法:1.用的最多的是Substring,这个也是我一直用的s = s.Sub ...