线程池内传递多个参数的问题

bpmfwu 2008-11-18 10:54:30
我有一个DataView,每1行有5列,我现在想把每列的数值作为参数传递给方法 StartPingMonitor, 请问如何实现?


System.Data.DataView dvMonitor = MyDB.GetDataView("Ping_FG_IPTVIPMonitor"); // DataView 赋值

for (int i = 0;i <dvMonitor.cout ; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(StartPingMonitor), dvMonitor); // 这里该如何写?
}


...全文
268 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamsnake 2008-11-19
  • 打赏
  • 举报
回复
我都是传键值对,然后到线程里再强制转换的。
当然,用数组也可以,只是感觉键值对取值的时候比较直观。呵呵
bpmfwu 2008-11-19
  • 打赏
  • 举报
回复
还有其他方法么?
gomoku 2008-11-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bpmfwu 的回复:]
直接传入DATAVIEW是肯定不行的,一来浪费资源,二来你必须设置一个静态参数来控制行数,线程间不安全。
[/Quote]
Good point :)

object[] state = new object[]{
dvMonitor[i]["ip"],
dvMonitor[i]["asdf"],
dvMonitor[i]["qwer"],
dvMonitor[i]["zxcv"],
dvMonitor[i]["...."]
};
ThreadPool.QueueUserWorkItem(new WaitCallback(StartPingMonitor), state);
jy251 2008-11-18
  • 打赏
  • 举报
回复
.net 2.0 的特性啊····参数可以传递给线程。.net1.1可是没有。

没办法,机器落后,我还在使用.net1.1,我的方法:
定义线程池,不使用类库所给的线程池,自己定义线程数组,thread[]。
定义变量数组Var[],变量数组个数与thrad数量一致。
接下来不就好办了吗??

对于同一个i来说,thread[i]不就对应Var[i]了吗??传参数我看是没有必要了吧。如果怕线程不安全,那么定义互斥

private static Mutex mut = new Mutex();
mut.WaitOne();
//数据操作 &×……)×%……¥
mut.ReleaseMutex();
bpmfwu 2008-11-18
  • 打赏
  • 举报
回复
直接传入DATAVIEW是肯定不行的,一来浪费资源,二来你必须设置一个静态参数来控制行数,线程间不安全。
lee118 2008-11-18
  • 打赏
  • 举报
回复
直接传入DATAVIEW

void StartPingMonitor(object state)
{
DataView dv = state as DataView;
//...
}

bpmfwu 2008-11-18
  • 打赏
  • 举报
回复
楼上的不对歪,只能传递一个参数["ip"],我一行有5个参数需要传递的。
gomoku 2008-11-18
  • 打赏
  • 举报
回复

{
System.Data.DataView dvMonitor = MyDB.GetDataView("Ping_FG_IPTVIPMonitor");

for (int i = 0; i < dvMonitor.cout; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(StartPingMonitor), dvMonitor[i]["ip"]);
}
}

void StartPingMonitor(object state)
{
string ip = state as string;
//...
}
周公 2008-11-18
  • 打赏
  • 举报
回复
System.Data.DataView dvMonitor = MyDB.GetDataView("Ping_FG_IPTVIPMonitor"); // DataView 赋值                   

ArrayList parameters=new ArrayList();//用集合来保存参数信息,因为集合可以当作一个object来看待
for (int i = 0;i <dvMonitor.cout ; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(StartPingMonitor), parameters); //传递参数集合信息
}
bpmfwu 2008-11-18
  • 打赏
  • 举报
回复
定自己,期待解决
Windows下比较完美线程池的升级版,加入了我对线程池能想到的几乎所有功能,而且更改了第一版本的一些Bug,并进行了效率的优化。 第一版的介绍地址:http://blog.csdn.net/fishjam/article/details/8632049 功能列表如下: 1.能自动根据任务和线程的多少在 最小/最大 线程个数之间调整(Vista后的系统有 SetThreadpoolThreadMaximum 等函数有类似功能),现已支持动态改变最小、最大值。 2.可以设置等待Job的最大个数,并在加入Job时,队列满了的话,可以设置等待超时并根据返回值进一步处理 3.能方便的对任一任务进行取消,如任务尚未运行则由框架代码处理,如任务已经运行,则需要 JobBase 的子类根据 GetJobWaitType 的返回值进行处理 4.能对单个Job或整个线程池进行 暂停、继续、停止 处理 -- 需要 JobBase 的子类根据 GetJobWaitType 的返回值进行处理 5.支持回调方式的反馈通知( Progress/Error 等) 6.使用模版方式实现,能方便的进行参数传递 7.在加入任务时可以设置优先级,现已支持动态调整优先级 8.使用的是微软的基本API,能支持WinXP、Vista、Win7等各种操作系统(CreateThreadpoolWork 等只能在Vista后才能使用) 9.可以有多个实例,方便进行控制(QueueUserWorkItem 等是单实例) 10.采用的是对称模式的线程池(没有管理线程),运行成本低

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧