- 浏览: 244330 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
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 1263项目中碰到了静态页文件读写冲突的问题(如果同时存在读写就报黄页 ... -
线程,同步与锁——Lock你到底锁住了谁
2011-04-03 14:59 778线程在多核时代的优势 ... -
多线程下WinForm开发应该注意哪些问题?
2011-04-03 14:52 945昨日,与一同事一起在 ... -
在多线程中如何调用Winform
2011-04-03 14:44 888转自 dengsu888666 每一 ... -
关于.NET异步调用的初步总结
2011-04-03 14:42 1003最近看了看.NET异步调用方面的资料,现择重点总结,若有纰漏敬 ... -
对 Windows 窗体控件进行线程安全调用
2011-04-03 14:39 918今天在编写一个windows应用程序的时候碰到了一个小问题,程 ... -
DotNet中异步编程的简单应用
2011-04-03 14:35 537这里说的异步编程并不是AJAX等的Web异步编程,而仅仅是Do ... -
winform程序中如何跨线程修改控件的值
2011-04-03 14:30 1623winform程序是单线程的。 /// <summar ... -
生产者消费者线程在Queue中实现多线程同步
2011-04-03 14:19 2395使用C#进行多线程编程经常会用队列池进行线程同步的方法,实现就 ... -
C# 多线程下载
2011-04-03 14:12 1633下面是一个完整的多线程下载源码,我在写代码的时候遇到点问题也放 ... -
.NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke
2011-04-03 14:06 12251,错误的代码是: using System; using ... -
利用委托机制处理.NET中的异常
2011-04-03 14:01 1137转自 terrylee.cnblogs.com 概述 在. ... -
线程安全类 跨线程修改窗体UI
2011-04-03 13:54 874private void ThreadSafeInvoke(C ...
相关推荐
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
在编程领域,多线程是实现并发执行任务的关键技术,特别是在服务器端开发和高并发应用中,多线程能够充分利用CPU资源,提高程序的运行效率。这个名为"多线程demo程序-轻松掌握多线程技术"的项目,旨在帮助开发者理解...
在“iOS多线程Demo”中,可能会包含如何在后台线程完成耗时操作后,在主线程更新UI的方法,如使用`dispatch_async`向主线程发送任务,或者使用`performSelectorOnMainThread`。 此外,多线程还会涉及线程安全问题,...
在这个“Delphi多线程Demo”中,我们将探讨如何在Delphi中创建和管理线程,以及如何实现在线程中定时刷新任务,以保持用户界面的响应性。 首先,我们需要理解多线程的基本概念。在单线程程序中,所有任务都在同一个...
在C#编程中,多任务多线程是一个重要的概念,特别是在处理大文件下载或执行大量I/O密集型操作时,可以显著提升程序的效率。这个"多任务多线程demo.zip"是一个示例项目,展示了如何利用C#来实现一个多线程文件下载...
在编程领域,多线程是一种常见且重要的技术,特别是在需要并发执行多个任务或优化资源利用率时。易语言,作为一款国人自创的编程语言,同样支持多线程编程,使开发者能够利用多核处理器的优势,提高程序的执行效率。...
在Java编程中,多线程是一项关键技能,它能让程序同时执行多个任务,提升系统效率。本项目"多线程demo/java多线程练习"旨在通过实际操作来深入理解和掌握多线程技术,同时模拟数据库操作,这在现代应用程序开发中至...
在C#编程中,多线程是一个至关重要的概念,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。本压缩包“C#多线程Demo”提供了四个具体的WinForm多线程示例,旨在帮助开发者深入理解和掌握线程的使用...
在C++编程中,多线程(Multithreading)是一种技术,它允许程序同时执行多个独立的任务或子任务。这可以极大地提高效率,特别是在多核处理器系统中,每个线程都可以在不同的处理器核心上运行。本示例"MultiThread...
多线程允许程序同时执行多个独立的任务,提高系统的并发性和资源利用率。这个“异步多线程Demo”很可能是为了帮助学习者理解并实践多线程编程而提供的一个实例。 1. **线程定义**:线程是程序执行的最小单元,每个...
本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很清晰很详细)”的描述,我们将围绕这个示例进行讲解。 1. **线程基础**: - **主线程**:Android应用的UI线程,负责处理用户交互和更新界面。...
它可以安全地在后台线程执行任务,避免了与Unity主线程的冲突。Loom V1.6可能包含了更高级的功能,如线程池管理、任务调度、错误处理等,简化了在Unity中实现复杂多线程逻辑的过程。 5. **多线程应用**:在Unity中...
多线程允许一个应用程序同时执行多个不同的任务,每个任务被称为一个线程。在Linux中,可以使用POSIX线程库(pthread)来创建和管理线程。主要API包括`pthread_create()`用于创建线程,`pthread_join()`等待线程结束...
多线程允许程序同时执行多个不同的任务,提高资源利用率。 2. **TThread类**:在Delphi中,我们可以利用VCL框架中的TThread类来创建自定义的线程。TThread是线程的基础类,提供了线程的创建、同步、通信等功能。 3...
这个"android多线程下载demo"展示了如何利用多线程分段下载一个APK文件,同时实现实时更新UI展示下载进度,并在下载完成后自动跳转到应用安装界面。以下是对这个Demo涉及知识点的详细解释: 1. **多线程下载**:多...
在单线程程序中,所有任务都在同一个执行流中完成,而多线程则允许程序同时执行多个任务,提高了程序的并行性。在VS2010中,我们可以利用C++ Standard Template Library(STL)中的`<thread>`库来创建和管理线程。 ...
在某些场景下,定时任务可能需要执行多线程任务。比如,定时检查数据库中的待处理任务,并使用多线程并行处理这些任务。此时,可以在定时任务中调用标记了`@Async`的方法,实现定时任务和多线程任务的完美结合。 ...
5. 销毁线程池:当没有更多任务且所有任务都执行完毕后,线程池会关闭,工作线程会被安全地终止。 在C++中,实现线程池可以利用`std::condition_variable`和`std::queue`等工具来实现线程间的同步和通信。`std::...