- 浏览: 237095 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
yulanlian:
...
实现在删除数据后,自增列的值连续 -
RonQi:
楼主写的很好,支持原创!
Google Protocol Buffers
这个场景应用比较普遍,
比如多个线程下载多个文件,比如3个线程下载10个文件,比如10个线程执行1000条任务队列;
Demo代码如下:
using System; using System.Threading; public partial class Form1 : Form { private ThreadProxy _threadsProxy = null; ExpressCollection list = new ExpressCollection(); public Form1() { InitializeComponent(); _threadsProxy = new ThreadProxy(3, list); _threadsProxy.ExpressComputed += new EventHandler<ExpressComputedEventArgs>(_threadsProxy_ExpressComputed); } private void button1_Click(object sender, EventArgs e) { list.Clear(); _threadsProxy.Stop(); list.Add(new Express(1, 1)); list.Add(new Express(1, 2)); list.Add(new Express(1, 3)); list.Add(new Express(1, 4)); list.Add(new Express(1, 5)); list.Add(new Express(1, 6)); list.Add(new Express(1, 7)); list.Add(new Express(1, 8)); list.Add(new Express(1, 9)); list.Add(new Express(1, 10)); list.Add(new Express(1, 11)); list.Add(new Express(1, 12)); list.Add(new Express(1, 13)); list.Add(new Express(1, 14)); Console.WriteLine("启动线程..........................."); _threadsProxy.Run(); } private void button2_Click(object sender, EventArgs e) { if (_threadsProxy != null) { Console.WriteLine("测试暂停..........................."); _threadsProxy.Stop(); } } void _threadsProxy_ExpressComputed(object sender, ExpressComputedEventArgs e) { Console.WriteLine(string.Format("ThreadID:{0} {1} + {2} = {3}", Thread.CurrentThread.ManagedThreadId, e.Express.A, e.Express.B, e.Result)); } } public class ThreadProxy : IDisposable { private int _threadCount = 1; ExpressCollection _list; private Thread[] _threads = null; private bool _isRun = false; public ThreadProxy(ExpressCollection list) { _list = list; } public ThreadProxy(int threadCount, ExpressCollection list) : this(list) { _threadCount = threadCount; _threads = CreateThreadCollection(); } public void Run() { if (!_isRun && _list != null && _list.Count > 0) { _isRun = true; for (int i = 0; i < _threadCount; i++) { _threads[i] = new Thread(new ThreadStart(ThreadInvoke)); _threads[i].IsBackground = true; _threads[i].Start(); } } } protected virtual Thread[] CreateThreadCollection() { return new Thread[_threadCount]; } public void Stop() { _isRun = false; } private void ThreadInvoke() { try { while (_isRun) { Express express = _list.GetNext(); if (express != null) { int result = express.A + express.B; OnExpressComputed(result, express); //do something Thread.Sleep(1000);//测试暂停 } else { break; } } } catch (ThreadAbortException) { Thread.ResetAbort(); return; } catch (Exception) { //记录日志 } } public event EventHandler<ExpressComputedEventArgs> ExpressComputed; protected virtual void OnExpressComputed(int result, Express express) { if (ExpressComputed != null) { ExpressComputed(this, new ExpressComputedEventArgs(result, express)); } } #region IDisposable 成员 public void Dispose() { _isRun = false; if (_threads != null) { _threads = null; } } #endregion } public class ExpressComputedEventArgs : EventArgs { private int result; public int Result { get { return result; } set { result = value; } } public ExpressComputedEventArgs(int result, Express express) { this.result = result; this.express = express; } private Express express; public Express Express { get { return express; } set { express = value; } } } public class BaseCollection<T> : List<T> { protected readonly object _lockObj = new object(); private int index = 0; public virtual T GetNext() { T result = default(T); if (this.Count > 0 && index < Count) { lock (_lockObj) { result = this[index]; index++; } } return result; } public new void Add(T item) { lock (_lockObj) { base.Add(item); } } public new void Clear() { lock (_lockObj) { index = 0; base.Clear(); } } } public class Express { private int _a; public int A { get { return _a; } set { _a = value; } } private int _b; public int B { get { return _b; } set { _b = value; } } public Express(int a, int b) { _a = a; _b = b; } } public class ExpressCollection : BaseCollection<Express> { }
源代码下载
http://www.cnblogs.com/szyicol/archive/2009/07/17/1525485.html
发表评论
-
文件读写冲突的解决办法:ReaderWriterLock
2011-04-07 14:59 1221项目中碰到了静态页文件读写冲突的问题(如果同时存在读写就报黄页 ... -
线程,同步与锁——Lock你到底锁住了谁
2011-04-03 14:59 744线程在多核时代的优势 ... -
多线程下WinForm开发应该注意哪些问题?
2011-04-03 14:52 907昨日,与一同事一起在 ... -
在多线程中如何调用Winform
2011-04-03 14:44 861转自 dengsu888666 每一 ... -
关于.NET异步调用的初步总结
2011-04-03 14:42 978最近看了看.NET异步调用方面的资料,现择重点总结,若有纰漏敬 ... -
对 Windows 窗体控件进行线程安全调用
2011-04-03 14:39 880今天在编写一个windows应用程序的时候碰到了一个小问题,程 ... -
DotNet中异步编程的简单应用
2011-04-03 14:35 508这里说的异步编程并不是AJAX等的Web异步编程,而仅仅是Do ... -
winform程序中如何跨线程修改控件的值
2011-04-03 14:30 1574winform程序是单线程的。 /// <summar ... -
生产者消费者线程在Queue中实现多线程同步
2011-04-03 14:19 2357使用C#进行多线程编程经常会用队列池进行线程同步的方法,实现就 ... -
C# 多线程下载
2011-04-03 14:12 1581下面是一个完整的多线程下载源码,我在写代码的时候遇到点问题也放 ... -
.NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke
2011-04-03 14:06 11821,错误的代码是: using System; using ... -
利用委托机制处理.NET中的异常
2011-04-03 14:01 1108转自 terrylee.cnblogs.com 概述 在. ... -
线程安全类 跨线程修改窗体UI
2011-04-03 13:54 839private void ThreadSafeInvoke(C ...
相关推荐
这个压缩包中是一个简单的多线程实例,在线程执行时,每隔一秒刷新一次当前时间!演示了如何在不影响主进程的情况下如何执行其他长时间等待任务。
多条线程同时下载一个任务,下载中断时,将以下载的数据大小存入数据库,网络恢复时,自动查询数据库中是否存在未下载完成任务,有就下载,没有就查询任务表执行下一个下载任务; 有必要的话 自己来建一个下载任务表...
注意事项: 1、主进程传入的对象或变量不管...2、“任务线程类”中有一个内部timing类,监控自己是否执行完成,会改标志。“任务管理类”也有一个timing监控“任务信息类”和“任务线程类”的情况,把完成的结束。
ios demo,dispatch_async,DISPATCH_QUEUE_CONCURRENT,多任务并发执行,自动创建多线
通过多线程处理大批量耗时业务,并返回结果。当监测到线程池中存在空闲线程时则动态向线程池中添加新的任务,直到所有任务执行结束。Demo为自己写的测试使用,下载后可直接运行测试。
VS+QT多线程实现,继承Qthread,重写run方法。写了一个demo。子线程里面为一个循环函数,没有执行实际任务。主要是为了方便理解。
6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 (旧的系统症结所在) 开启过多线程,导致系统...
TaskQueue的DEMO SHOW实现队列的多线程任务分配.
线程池是一种线程使用模式,它管理着一组可重用的线程,可以处理分配过来的可并发执行的任务。 线程池设有最大线程数,可以避免线程数过多会导致额外的线程切换开销。 线程池管理的线程具有可重用性,可以减少创建和...
最近完成了一个日志分析项目,执行效率也还行。顺手抽取了思路写了一个demo,分享给大家。 eclipse直接导入Java Project。build path需要自己修改一下。...项目使用了Quartz、Jaxb和spring多线程等技术。
InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException,...
多线程并发执行任务demo,用到 System.Threading.Tasks
GCD详解Demo 同步异步任务,并行串行队列 同步和异步决定了要不要开启新的线程 同步:在当前线程中执行任务,不具备开启新线程的能力 ...并发:多个任务并发(同时)执行 串行:一个任务执行完毕后,再执行下一个任务
简介: 本 Demo 演示了如何使用 Python 的标准库 queue 和 tkinter 来创建一个简单的图形用户界面(GUI)。...通过多线程实现耗时操作的并行执行。 在耗时操作期间,GUI 界面可以显示进度或状态信息。
多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过...
| | ... 更多任务 | |-- config.php 全局配置文件 |-- main.php 框架入口文件 |-- windows_single.cmd windows快速启动文件 框架说明 linux下子进程执行任务,修改脚本无需重启后台服务立即...
多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过...
多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过...
多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过...
springboot定时任务demo 使用SpringBoot创建定时任务非常简单, 目前主要有以下三种创建方式: 一、基于注解(@Scheduled) 二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从...