- 浏览: 724855 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1081)
- [网站分类]1.首页原创精华.NET区(包含架构设计、设计模式)(对首页文章的要求:原创、高质量、经过认真思考并精心写作) (0)
- [网站分类]2..NET新手区(用于发表不合适发表在首页的.NET技术文章,包括小经验、小技巧) (1)
- [网站分类]3.非技术区(技术之外的文章,但不要涉及任何政治内容) (0)
- [网站分类]4.其他技术区 (0)
- [网站分类]5.企业信息化 (0)
- [网站分类]6.读书心得区(技术书籍阅读心得、书籍推荐) (0)
- [网站分类]7.提问区(.NET技术方面的提问) (2)
- [网站分类]8.技术转载区(.NET技术文章转载, 请注明原文出处) (0)
- [网站分类]9.求职招聘区(个人求职、企业招聘) (0)
- [网站分类]Dottext区 (0)
- [网站分类]GIS技术 (0)
- [网站分类]IT英才专区(IT职场交流) (0)
- [网站分类]SharePoint (0)
- [网站分类]博客园.NET俱乐部(俱乐部组织与活动方面的文章) (0)
- [网站分类]软件发布区(发布自己开发的代码、软件) (0)
- [网站分类]网站管理区(网站管理方面的疑问、建议、意见, 寻求管理员帮助) (0)
- [网站分类]业界新闻 (1)
- 技术 (1)
- [随笔分类]生活感悟 (10)
- [随笔分类]C# (30)
- [随笔分类]AjaxPro教程 (3)
- [发布至博客园首页] (5)
- [随笔分类]简历 (0)
- [随笔分类]Linux (2)
- [随笔分类]技术聚会 (2)
- [随笔分类]ORM (1)
- [随笔分类]php (1)
- [随笔分类]创业 (1)
- [随笔分类]奇技淫巧 (1)
- [随笔分类]计划 (1)
- [随笔分类]架构&分层 (1)
- [随笔分类]整合行销 (1)
- [随笔分类]mac (1)
- [网站分类].NET新手区 (45)
- [网站分类]非技术区 (5)
- [网站分类]招聘区 (0)
- [随笔分类]单元测试 (1)
- [网站分类]其他技术区 (3)
- [网站分类]代码与软件发布 (6)
- [网站分类]提问区 (24)
- [随笔分类]ASP.NET (2)
- [随笔分类]FAQ (12)
- [随笔分类]开发人员工具 (1)
- [随笔分类]朗志轻量级项目管理解决方案 (1)
- [网站分类]读书区 (1)
最新评论
-
天使建站:
写和乱七八糟的 不知道从哪复制过来的 还是看这里吧j ...
jquery数组 -
hyn450:
你好,我最近也想了解一下竞争情报。不知道能不能交流一下呢 ?
最近的工作 -
lattimore:
这个连接打不开了阿!
使用vnc连ubuntu desktop -
MZhangShao:
奉劝你一句,以后在Ubuntu 用apt-get安装成功的软件 ...
关于xrdp的安装设置 -
f002489:
strftime
python下datetime类型的转换
.net内置的threadpool对于加入执行队列的任务,或是正在执行的任务无法取消,这对于我的项目来说有问题,因此要自定义一个线程池。
我的项目中具体的应用情节如下,某一个操作会非常耗时(将网址插入bdb中),如果将其加入线程池中,很可能将线程池中的资源耗尽,因此我希望我可以定义一个maxThreadNum用来控制执行此在操作最大允许同时执行的线程数,同时设定线程等级为最低ThreadPriority.Lowest,我只要这个操作慢慢执行就行了。
代码还需要重构,高手请指点下,对锁的机制还是不太清楚,
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Rhino.Commons;
namespace ThreadPool
{
public static class MyThreadPool
{
static object obj = new object();
static AutoResetEvent wait = new AutoResetEvent(false);
static MyThreadPool()
{
System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(aa), state, 2000,true);
SetMaxThreadNum(1);
}
private static void aa(object state, bool timedOut)
{
lock (obj)
{
//判断任务队列中有无积压的任务且有无空闲的线程,如果符合上述条件则执行之
List<string> removeKey = new List<string>();
List<WorkerThread> newTask=new List<WorkerThread>();
//Dictionary<string,WorkerThread> addDict=new Dictionary<string, WorkerThread>();
foreach (var kvp in dict)
{//kvp.Value.ThreadState == ThreadState.Unstarted ||
if (kvp.Value.Thread.ThreadState == ThreadState.Suspended)
{
//dict.Remove(kvp.Key);//cancle because of lock
WorkerThread a=queue.FirstOrDefault();
if (a != null)
{
removeKey.Add(kvp.Key);
//addDict.Add(a.Key, kvp.Value.Change(a));
newTask.Add(kvp.Value.Change(a));
queue.RemoveAt(0);
//dict.Add(a.Key, kvp.Value.Change(a));//cancle because of lock
//将参数加到线程中,并改变线程的状态
//dict[a.Key].Thread.Resume();
}
else
break;
//else
//{
// System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(aa), state,
// 2000, true);
// return;
//}
}
}
removeKey.ForEach(t=>dict.Remove(t));
newTask.ForEach(t =>
{
dict.Add(t.Key, t);
t.Thread.Resume();
});
while (queue.Count > 0 && dict.Count < MaxThreadNum)
{
//未到线程池最大池程数时,增加线程
WorkerThread b = queue.FirstOrDefault();
if (b!=null)
{
queue.RemoveAt(0);
//Thread thd = new Thread(new ThreadStart(b.Exec));
//thd.Priority = ThreadPriority.Lowest;
//dict.Add(b.Key, thd);
//thd.Start();
WorkerThread wt = new WorkerThread();
wt.Start(b);
dict.Add(wt.Key, wt);
wt.Thread.Start();
//将参数加到线程中,并改变线程的状态
}
}
System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(aa), state, 2000, true);
}
}
//private static int _maxThreadNum = 1;
public static int MaxThreadNum
{
//get { return _maxThreadNum; }
//set { _maxThreadNum = value; }
get; set;
}
public static void SetMaxThreadNum(int num)
{
if (num < 1)
num = 1;
MaxThreadNum = num;
}
/// <summary>
/// 任务执行队列
/// </summary>
//static ThreadSafeQueue<WorkerThread> queue = new ThreadSafeQueue<WorkerThread>();
static List<WorkerThread> queue=new List<WorkerThread>();
/// <summary>
/// 目前暂定为只使用一个线程,以免耗近资源
/// </summary>
static Dictionary<string, WorkerThread> dict = new Dictionary<string, WorkerThread>(1);
private static object state;
public static void Aborted(string key)
{
lock (obj)
{
WorkerThread v;
if (dict.TryGetValue(key, out v))
{
v.Thread.Abort();
dict.Remove(key);
}
int index = queue.FindIndex(t => t.Key == key);
if (index>-1)
queue.RemoveAt(index);
wait.Set();
}
}
public static void QueueUserWorkItem(WaitCallback callback, object state, string key)
{
WorkerThread p = new WorkerThread()
{
Callback = callback,
State = state,
Key = key
};
//queue.Enqueue(p);
queue.Add(p);
wait.Set();
}
}
}
public class WorkerThread
{
public Thread Thread { get; set; }
public string Key { get; set; }
public WaitCallback Callback { get; set; }
public Object State { get; set; }
public void Exec()
{
while (true)
{
this.Callback(this.State);
this.Thread.Suspend();
}
}
public WorkerThread Change(WorkerThread wt)
{
this.Key = wt.Key;
this.Callback = wt.Callback;
this.State = wt.State;
return this;
}
public void Start(WorkerThread wt)
{
this.Change(wt);
this.Thread = new Thread(new ThreadStart(this.Exec));
this.Thread.Priority = ThreadPriority.Lowest;
}
//public void Start(WaitCallback callback,Object state)
//{
// this.Callback = callback;
// this.State = state;
// if(this.Thread==null){
// this.Thread = new Thread(new ThreadStart(this.Exec));
// this.Thread.Priority = ThreadPriority.Lowest;
// this.Thread.IsBackground = true;
// this.Thread.Start();
// return;
// }
// if(this.Thread.ThreadState==ThreadState.Suspended)
// {
// this.Thread.Resume();
// }
//}
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Rhino.Commons;
namespace ThreadPool
{
public static class MyThreadPool
{
static object obj = new object();
static AutoResetEvent wait = new AutoResetEvent(false);
static MyThreadPool()
{
System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(aa), state, 2000,true);
SetMaxThreadNum(1);
}
private static void aa(object state, bool timedOut)
{
lock (obj)
{
//判断任务队列中有无积压的任务且有无空闲的线程,如果符合上述条件则执行之
List<string> removeKey = new List<string>();
List<WorkerThread> newTask=new List<WorkerThread>();
//Dictionary<string,WorkerThread> addDict=new Dictionary<string, WorkerThread>();
foreach (var kvp in dict)
{//kvp.Value.ThreadState == ThreadState.Unstarted ||
if (kvp.Value.Thread.ThreadState == ThreadState.Suspended)
{
//dict.Remove(kvp.Key);//cancle because of lock
WorkerThread a=queue.FirstOrDefault();
if (a != null)
{
removeKey.Add(kvp.Key);
//addDict.Add(a.Key, kvp.Value.Change(a));
newTask.Add(kvp.Value.Change(a));
queue.RemoveAt(0);
//dict.Add(a.Key, kvp.Value.Change(a));//cancle because of lock
//将参数加到线程中,并改变线程的状态
//dict[a.Key].Thread.Resume();
}
else
break;
//else
//{
// System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(aa), state,
// 2000, true);
// return;
//}
}
}
removeKey.ForEach(t=>dict.Remove(t));
newTask.ForEach(t =>
{
dict.Add(t.Key, t);
t.Thread.Resume();
});
while (queue.Count > 0 && dict.Count < MaxThreadNum)
{
//未到线程池最大池程数时,增加线程
WorkerThread b = queue.FirstOrDefault();
if (b!=null)
{
queue.RemoveAt(0);
//Thread thd = new Thread(new ThreadStart(b.Exec));
//thd.Priority = ThreadPriority.Lowest;
//dict.Add(b.Key, thd);
//thd.Start();
WorkerThread wt = new WorkerThread();
wt.Start(b);
dict.Add(wt.Key, wt);
wt.Thread.Start();
//将参数加到线程中,并改变线程的状态
}
}
System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(aa), state, 2000, true);
}
}
//private static int _maxThreadNum = 1;
public static int MaxThreadNum
{
//get { return _maxThreadNum; }
//set { _maxThreadNum = value; }
get; set;
}
public static void SetMaxThreadNum(int num)
{
if (num < 1)
num = 1;
MaxThreadNum = num;
}
/// <summary>
/// 任务执行队列
/// </summary>
//static ThreadSafeQueue<WorkerThread> queue = new ThreadSafeQueue<WorkerThread>();
static List<WorkerThread> queue=new List<WorkerThread>();
/// <summary>
/// 目前暂定为只使用一个线程,以免耗近资源
/// </summary>
static Dictionary<string, WorkerThread> dict = new Dictionary<string, WorkerThread>(1);
private static object state;
public static void Aborted(string key)
{
lock (obj)
{
WorkerThread v;
if (dict.TryGetValue(key, out v))
{
v.Thread.Abort();
dict.Remove(key);
}
int index = queue.FindIndex(t => t.Key == key);
if (index>-1)
queue.RemoveAt(index);
wait.Set();
}
}
public static void QueueUserWorkItem(WaitCallback callback, object state, string key)
{
WorkerThread p = new WorkerThread()
{
Callback = callback,
State = state,
Key = key
};
//queue.Enqueue(p);
queue.Add(p);
wait.Set();
}
}
}
public class WorkerThread
{
public Thread Thread { get; set; }
public string Key { get; set; }
public WaitCallback Callback { get; set; }
public Object State { get; set; }
public void Exec()
{
while (true)
{
this.Callback(this.State);
this.Thread.Suspend();
}
}
public WorkerThread Change(WorkerThread wt)
{
this.Key = wt.Key;
this.Callback = wt.Callback;
this.State = wt.State;
return this;
}
public void Start(WorkerThread wt)
{
this.Change(wt);
this.Thread = new Thread(new ThreadStart(this.Exec));
this.Thread.Priority = ThreadPriority.Lowest;
}
//public void Start(WaitCallback callback,Object state)
//{
// this.Callback = callback;
// this.State = state;
// if(this.Thread==null){
// this.Thread = new Thread(new ThreadStart(this.Exec));
// this.Thread.Priority = ThreadPriority.Lowest;
// this.Thread.IsBackground = true;
// this.Thread.Start();
// return;
// }
// if(this.Thread.ThreadState==ThreadState.Suspended)
// {
// this.Thread.Resume();
// }
//}
}
测试代码
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadPoolTest
{
public class Class1
{
static ManualResetEvent wait=new ManualResetEvent(false);
static void Main(string[] args)
{
object state=new object();
ThreadPool.MyThreadPool.QueueUserWorkItem(new WaitCallback(test), state, "aa");
ThreadPool.MyThreadPool.QueueUserWorkItem(new WaitCallback(test2), state, "bb");
System.Threading.Thread.Sleep(10000);
wait.Set();
System.Threading.Thread.Sleep(10000);
Console.WriteLine("aborted aa");
ThreadPool.MyThreadPool.Aborted("aa");
ThreadPool.MyThreadPool.QueueUserWorkItem(new WaitCallback(test3), state, "cc");
System.Threading.Thread.Sleep(10000);
Console.WriteLine("aborted bb");
ThreadPool.MyThreadPool.Aborted("bb");
ThreadPool.MyThreadPool.QueueUserWorkItem(new WaitCallback(test4), state, "dd");
Console.ReadLine();
}
private static void test4(object state)
{
Console.WriteLine("test4");
}
private static void test3(object state)
{
Console.WriteLine("test3");
}
private static void test2(object state)
{
while(true)
{
Console.WriteLine("test2");
Thread.Sleep(2000);
}
}
private static void test(object state)
{
while (true)
{
Console.WriteLine("test");
Thread.Sleep(2000);
wait.WaitOne();//只执行一次
}
}
}
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadPoolTest
{
public class Class1
{
static ManualResetEvent wait=new ManualResetEvent(false);
static void Main(string[] args)
{
object state=new object();
ThreadPool.MyThreadPool.QueueUserWorkItem(new WaitCallback(test), state, "aa");
ThreadPool.MyThreadPool.QueueUserWorkItem(new WaitCallback(test2), state, "bb");
System.Threading.Thread.Sleep(10000);
wait.Set();
System.Threading.Thread.Sleep(10000);
Console.WriteLine("aborted aa");
ThreadPool.MyThreadPool.Aborted("aa");
ThreadPool.MyThreadPool.QueueUserWorkItem(new WaitCallback(test3), state, "cc");
System.Threading.Thread.Sleep(10000);
Console.WriteLine("aborted bb");
ThreadPool.MyThreadPool.Aborted("bb");
ThreadPool.MyThreadPool.QueueUserWorkItem(new WaitCallback(test4), state, "dd");
Console.ReadLine();
}
private static void test4(object state)
{
Console.WriteLine("test4");
}
private static void test3(object state)
{
Console.WriteLine("test3");
}
private static void test2(object state)
{
while(true)
{
Console.WriteLine("test2");
Thread.Sleep(2000);
}
}
private static void test(object state)
{
while (true)
{
Console.WriteLine("test");
Thread.Sleep(2000);
wait.WaitOne();//只执行一次
}
}
}
}
发表评论
-
关于分层架构中的业务实体层的使用一直不太清楚,可否指点一下?
2007-03-23 09:10 671我知道业务逻辑层又可细分为三个层次,分别是业务外观层业务规则层 ... -
xml反串行化
2007-07-02 17:23 7321using System; 2using Syste ... -
WriteXmlSchema(xsdFileName)和GetXmlSchema()输出的内容的差异
2007-07-04 19:00 881利用DataSet.ReadXml载入一个xml文件,再使用G ... -
对websharp中aspect的改进(待续)
2007-11-17 14:27 692缘起 为了在我的《朗志轻量级项目管理解决方案》项目中应用 ... -
WebSharp Aspect改进(续2)
2007-11-19 21:39 700接着上次在《朗志轻量级项目管理解决方案》中对Aspec ... -
TreeView(树形控件)中常用到的属性和事件
2007-11-19 22:22 12941.TreeView(树形控件) ... -
有没有适合的的面向对象的查询语言(Object Query Language)
2007-11-28 10:15 759在我做《朗志轻量级项目管理解决方案》的过程中,我希望 ... -
问题解答集
2007-11-29 18:11 4401 如何在源代码的目录下添加一个测试文件 ... -
FckEditor自定义按钮
2007-11-29 18:35 830目录 FckEditor自定义按钮 1 目录 ... -
GhstDoc2.1.1使用手册
2007-11-29 18:39 721目录 GhstDoc2.1.1使用手册 1 ... -
Log4net使用说明
2007-11-29 18:44 785Log4net使用说明 1 修改历史纪录 ... -
MySQLHelper类使用说明
2007-11-29 18:46 1315目录 MySQLHelper类使用说明 1 目录 ... -
NDoc1.3.1使用手册
2007-11-29 18:47 765目录 NDoc1.3.1使用手册 1 目录 ... -
程序中操作Word
2007-11-29 18:52 728目录 程序中操作Word 1 目录 2 ... -
利用SMTP服务发送电子邮件
2007-11-29 18:58 1352目录 利用SMTP服务发送电子邮件 1 目录 ... -
程序中操作Excel
2007-11-29 18:59 637目录 程序中操作Excel 1 目录 ... -
访问被拒绝:“AjaxPro”的解决方案
2007-11-29 19:01 531目录 访问被拒绝:&qu ... -
sqlserver的版本号
2008-02-27 21:01 819当你安装了sqlserver 2005之后你就可以使用sqls ... -
在安装有VS2008beta2版本的机子上使用vs2005进行部署出现问题的解决方法
2008-02-27 21:13 679我知道,2008rtm发布已经很久了,不巧的是同学在我的机子上 ... -
忙话codesmith
2008-07-28 15:01 866为什么不是闲话,因为我很忙,项目中新问题是接连不断,上一篇讲到 ...
相关推荐
在本主题中,我们将深入探讨如何使用JDOM库在Java中实现Spring的IoC(Inversion of Control,控制反转)功能,并结合Java 1.6的一些新特性来增强这一过程。Spring框架的核心特性之一就是其IoC容器,它负责管理对象的...
DataSnap是Embarcadero Delphi提供的一种强大的技术,它允许开发者构建分布式应用程序,实现数据的远程访问和处理。这个DEMO旨在展示如何在客户端和服务端之间进行数据交互,包括增删改查等基本数据库操作。 描述中...
udp组播时: 自已发自已不收,其他机子就能收到组播. 自已发自已也收,其他机子就收不到...如何实现udp组播时,自已发组播自已不收组播,其他机子就能收到组播.但是自已发组播自已也收组播,其他机子就收不到组播.这是为什么?
综上所述,本例涉及的核心知识点包括:二维数组的声明和动态分配、Zig-Zag扫描的算法实现,以及自定义类的封装。通过理解这些概念,开发者可以有效地处理类似的问题,无论是对二维数组进行特定的遍历,还是设计可...
本文将深入探讨如何在Linux环境下实现一个基本的`ping`程序,涉及的知识点包括网络套接字编程、ICMP协议、原始套接字以及信号处理。 首先,`ping`程序的核心是使用原始套接字(`SOCK_RAW`)来发送和接收Internet...
可实现combox样式,可自已编辑,一个文本框加下拉
(基于python3.6和定向爬虫的商品比价系统的实现) 三个文件夹: first文件夹是用面向对象实现的代码,实现了数据库和图形界面。 second使用面向过程的代码,实现了数据库和图形界面。 third是面向过程的代码,实现...
标题“做自已的网盘”暗示我们正在讨论一个个人或小型团队使用的本地网络存储解决方案,它可以替代商业网盘服务,提供数据共享和权限管理功能。这个系统是绿色免安装的,意味着它不需要复杂的安装过程,只需在拥有...
总的来说,“自已写记事本 MyTXT”涵盖了文本编辑器的基本实现、Windows平台下的程序开发、注册表操作等多个方面,对于学习和理解计算机程序设计有着实际的价值。无论是新手还是经验丰富的开发者,都能从中获取不同...
在本项目“pb自已做的视频监控”中,开发者利用PB9.0版本创建了一个视频监控系统。下面将详细阐述PB9.0在视频监控系统开发中的应用、相关技术及可能涉及的知识点。 1. PowerBuilder 9.0 简介: PowerBuilder 9.0是...
1. 创建一个新的View类,继承自已有的View或者 ViewGroup。 2. 在新类中重写必要的方法,如onDraw()来绘制视图,onMeasure()来测量尺寸,onLayout()来布局子视图等。 3. 实现特定的功能,例如在这个日历控件中,可能...
在构建Web应用时,JSP(JavaServer Pages)是一种广泛使用的服务器端脚本语言,它允许开发者使用HTML或XML语法中嵌入Java代码,从而动态生成网页内容。"JSP网站模板"则是一种预设计的网页布局和样式,用于简化和加速...
在IT行业中,API(应用程序编程...总的来说,"chboss自已用API访问rpt"的主题涵盖了API接口的使用、HTTP协议的基础、数据交换格式的理解以及实际的编程实现。这是一个涉及技术理解、文档阅读和问题解决的综合实践过程。
自已写的图形项界面, 主要功能就是在一个view中,显示item,并可对item进行操作,还有些缩放平移功能没有实现,没有动画效果.zip
实现一个提供网上购书功能的网站后端。 网站支持书商在上面开商店,购买者可能通过网站购买。 买家和卖家都可以注册自己的账号。 一个卖家可以开一个或多个网上商店, 买家可以为自已的账户充值,在任意商店购买图书...
能够自已设定时间,到时间就自动关机!!!
《用Dreamweaver MX打造自已的Blog》是关于使用Adobe Dreamweaver MX这款强大的网页设计工具创建个人博客的教程。Dreamweaver MX是2002年版本的Dreamweaver,它集成了HTML编辑、视觉设计和网站管理功能,为用户提供...
标题中的“自已写上传组件”意味着我们要讨论的是如何创建一个自定义的文件上传功能,这通常涉及到前端和后端的交互,以及处理文件上传的流程。在IT领域,文件上传是网页应用的一个常见功能,它允许用户将本地文件...
标题为“自已写的Webmvc框架”,这表明作者尝试创建了一个类似Spring MVC的自定义框架,用于处理Web应用程序的请求、路由和视图渲染。这里我们将详细探讨这一主题,包括相关的技术、设计原则和实现步骤。 1. **MVC...
1、集成提示对话框、用户选择对话框、用户单信息输入对话框和用户多...2、完全用JS+CSS样式实现; 3、实例版:文件中实现了各个对话框的功能转换操作,并且也给出了参数调用方法; 4、在使用中请尊重作者劳动成果。