C#线程池操作方法...

海角的孤星 2011-03-22 11:10:49
要求:
做一个窗体程序,当运行的时候,当到了一定时间自动生成excel。
1.根据要求生成excel的方法已经基本没有问题。
2.有的excel是每晚8:00 pm或11:59 pm 生成,有的excel是每个星期周末生成,有的是每个月底生成。

关于上次,计时解决了,新问题出来了。

同一时间可能生成多个excel,但是有的excel时间会比较长。程序容易发生死锁。
我考虑到 线程和线程池 。
最后觉得采用线程池更合理,但因为之前没接触这方面,找了几天资料,都没有头绪。
还有一点:不同时间点,都是在一个线程池里操作吗?还是一个时间点一个线程池?
希望大家能提供点实用的例子参考下 谢谢了
...全文
629 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
海角的孤星 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 yidongliange4 的回复:]

C# code

public delegate void StartSave(string name);

public static void Start(string name,StartSave a)
{

Thread myThread = new ThreadStart(new Thr……
[/Quote]

不是的 很明显错了 名字的后半段,不会相同
我就是想知道这方法该咋写...
yidongliange4 2011-03-23
  • 打赏
  • 举报
回复

public delegate void StartSave(string name);

public static void Start(string name,StartSave a)
{

Thread myThread = new ThreadStart(new ThreadStart(a(name)));
myThread.Start();
}

a(name) vs2003里面的参数是这么传递的吗 ?我没装vs2003没法测试。

只要你保证多个线程不会操作一个对象就不必lock

比如生成Excel文件时保证每次生成的文件名不同

yidongliange4 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 polk11 的回复:]

myThread.Start();
执行完了就自动销毁?
那每个生成excel就需要写一个ThreadMethod()?
具体生成的excel是他们以前写好的老方法...
[/Quote]
这个方法执行完了后,这个线程没任务了,他就会自动销毁。估计是垃圾回收机制做的。
只要一个方法就行啊,每次开启线程前给 dt 赋值。

把他ThreadMethod替换成你的老方法
linuxjava01 2011-03-22
  • 打赏
  • 举报
回复
把生产Excel的代码做成单例,传入Datatable和日期。
这样每次只有一个Excel生产在操作。
海角的孤星 2011-03-22
  • 打赏
  • 举报
回复
myThread.Start();
执行完了就自动销毁?
那每个生成excel就需要写一个ThreadMethod()?
具体生成的excel是他们以前写好的老方法...
yidongliange4 2011-03-22
  • 打赏
  • 举报
回复
DataTable dt=new DataTable();
public void StartSave(DataTable dtTmp)
{
dt= dtTmp;
Thread myThread = new Thread(new ThreadStart(ThreadMethod));
myThread.Start();//这是传进去的数据table,在这里给他负值。
}
//ThreadMethod ,
public void ThreadMethod()
{

// 这里使用dtTmp生成Excel

}

//在你生成事件里面调用StartSave ,这个方法执行完后线程他会自动销毁
种草德鲁伊 2011-03-22
  • 打赏
  • 举报
回复
不一定要传递参数进去吧。
海角的孤星 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yidongliange4 的回复:]

。。。。。
[/Quote]

这是是从VS2005才加进去的,so 我就悲剧了
不然之前就用了
海角的孤星 2011-03-22
  • 打赏
  • 举报
回复
VS2003 没有ParameterizedThreadStart委托....
yidongliange4 2011-03-22
  • 打赏
  • 举报
回复
public void StartSave(DataTable dt)
{
Thread myThread = new Thread(new ParameterizedThreadStart(ThreadMethod));
myThread.Start(dt);//这是传进去的数据table,在这里给他负值。
}
//ThreadMethod ,
public void ThreadMethod(object ParObject)
{
// 生成Excel

}

//在你生成事件里面调用StartSave ,这个方法执行完后线程他会自动销毁
海角的孤星 2011-03-22
  • 打赏
  • 举报
回复
还有 我使用的是VS2003...
希望大家帮帮忙 资料查了几天 大多转回到微软的那个demo上面了
海角的孤星 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yidongliange4 的回复:]

引用 4 楼 polk11 的回复:

引用 3 楼 karascanvas 的回复:

难道楼主想用线程池来实现计划任务?


是啊,有的每天生成,有的每周生成,有的每月生成....
同一时间可能生成十几个....


。。。。。。。。。。。。无语了。。。你设计有问题。


1:使用time控件实现计划任务
2:生成是使用线程执行生成Excel并保存的操作,避免界……
[/Quote]

我是用的timer控制时间....
也知道需要使用线程
只是......
线程这方面不会用 很多资料 但看不明白...
zengbolingcsdn 2011-03-22
  • 打赏
  • 举报
回复
你的生成如果是耗时比较长的话,建议使用单独的线程来完成。
如果是短小的任务,就可以丢到线程池里面去。
因为线程的创建和销毁是有成本的,所以小任务用线程池。

大任务用独立线程这样就不会阻塞线程池中的其他任务。
种草德鲁伊 2011-03-22
  • 打赏
  • 举报
回复
那不是Timer该做的事么...
yidongliange4 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 polk11 的回复:]

引用 3 楼 karascanvas 的回复:

难道楼主想用线程池来实现计划任务?


是啊,有的每天生成,有的每周生成,有的每月生成....
同一时间可能生成十几个....
[/Quote]

。。。。。。。。。。。。无语了。。。你设计有问题。


1:使用time控件实现计划任务
2:生成是使用线程执行生成Excel并保存的操作,避免界面假死。
yidongliange4 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 karascanvas 的回复:]

难道楼主想用线程池来实现计划任务?
[/Quote]

我估计他的意思是生成EXCEL时使用线程生成
海角的孤星 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 karascanvas 的回复:]

难道楼主想用线程池来实现计划任务?
[/Quote]

是啊,有的每天生成,有的每周生成,有的每月生成....
同一时间可能生成十几个....
种草德鲁伊 2011-03-22
  • 打赏
  • 举报
回复
难道楼主想用线程池来实现计划任务?
yidongliange4 2011-03-22
  • 打赏
  • 举报
回复
你这点点操作线程和线程池没多大差别,区别就在自己管理和线程池管理线程。

你把生成excel的代码写到一个函数里面 ,每一次保存Excel就开一个线程丢到线程池,或者自己管理。
当SaveExcel方法执行完后销毁线程(线程池你就不用管了,他自己会处理。)

SaveExcel(obj parms)
{
DataTable table= (DataTable)parms;
//根据穿过来的table 生成Excel。
}
加载更多回复(17)

110,536

社区成员

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

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

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