要求:
做一个窗体程序,当运行的时候,当到了一定时间自动生成excel。
1.根据要求生成excel的方法已经基本没有问题。
2.有的excel是每晚8:00 pm或11:59 pm 生成,有的excel是每个星期周末生成,有的是每个月底生成。关于上次,计时解决了,新问题出来了。同一时间可能生成多个excel,但是有的excel时间会比较长。程序容易发生死锁。
我考虑到 线程和线程池 。
最后觉得采用线程池更合理,但因为之前没接触这方面,找了几天资料,都没有头绪。
还有一点:不同时间点,都是在一个线程池里操作吗?还是一个时间点一个线程池?
希望大家能提供点实用的例子参考下 谢谢了
做一个窗体程序,当运行的时候,当到了一定时间自动生成excel。
1.根据要求生成excel的方法已经基本没有问题。
2.有的excel是每晚8:00 pm或11:59 pm 生成,有的excel是每个星期周末生成,有的是每个月底生成。关于上次,计时解决了,新问题出来了。同一时间可能生成多个excel,但是有的excel时间会比较长。程序容易发生死锁。
我考虑到 线程和线程池 。
最后觉得采用线程池更合理,但因为之前没接触这方面,找了几天资料,都没有头绪。
还有一点:不同时间点,都是在一个线程池里操作吗?还是一个时间点一个线程池?
希望大家能提供点实用的例子参考下 谢谢了
当SaveExcel方法执行完后销毁线程(线程池你就不用管了,他自己会处理。)SaveExcel(obj parms)
{
DataTable table= (DataTable)parms;
//根据穿过来的table 生成Excel。
}
我估计他的意思是生成EXCEL时使用线程生成
无语了你设计有问题。
1:使用time控件实现计划任务
2:生成是使用线程执行生成Excel并保存的操作,避免界面假死。
我是用的timer控制时间....
也知道需要使用线程
只是......
线程这方面不会用 很多资料 但看不明白...
希望大家帮帮忙 资料查了几天 大多转回到微软的那个demo上面了
{
Thread myThread = new Thread(new ParameterizedThreadStart(ThreadMethod));
myThread.Start(dt);//这是传进去的数据table,在这里给他负值。
}
//ThreadMethod ,
public void ThreadMethod(object ParObject)
{
// 生成Excel}//在你生成事件里面调用StartSave ,这个方法执行完后线程他会自动销毁
这是是从VS2005才加进去的,so 我就悲剧了
不然之前就用了
public void StartSave(DataTable dtTmp)
{
dt= dtTmp;
Thread myThread = new Thread(new ThreadStart(ThreadMethod));
myThread.Start();//这是传进去的数据table,在这里给他负值。
}
//ThreadMethod ,
public void ThreadMethod()
{ // 这里使用dtTmp生成Excel}//在你生成事件里面调用StartSave ,这个方法执行完后线程他会自动销毁
执行完了就自动销毁?
那每个生成excel就需要写一个ThreadMethod()?
具体生成的excel是他们以前写好的老方法...
这样每次只有一个Excel生产在操作。
只要一个方法就行啊,每次开启线程前给 dt 赋值。把他ThreadMethod替换成你的老方法
TreadStart()委托如何传入table的?
start()方法里不能带入参数
public void StartSave(DataTable dtTmp)
{
dt= dtTmp;我声明了一个全局的dt
恩 是吧 大姐的脸很阴沉啊!是不是这样的...Thread myThread1 = new Thread(new ThreadStart(ThreadMethod1));
Thread myThread2 = new Thread(new ThreadStart(ThreadMethod2));
.
.
.
myThread1.start();
myThread2.start();
.
.
我说的意思是线程是这样的吗
如果是这样,我就把这一套封装成方法,带入不同的生成方法替换ThreadStart里面的...
{
// 生成文件...
// 报告进度...
}
private void timer1_Tick(object sender, System.EventArgs e)
{
DateTime dt = DateTime.Now;
String strHM=dt.ToString("t"); if(strHM=="11:24")
{
Thread th1=new Thread(new ThreadStart(this.a));
Thread th2=new Thread(new ThreadStart(this.b)); th1.Start();
th2.Start();
} }这个写的测试下的
哎 太菜了 又纠结了一天...
你的time控件事件除非间隔多少 ?如果是秒,我估计你11:24分内要触发很多次吧 ?
你把time控件触发间隔设置成 61S,再象你上面这么写
另外出了点问题 呵呵 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)报错 这里该怎么写呀...
//生成方法
{
lock(this)
{
//方法体
}
}
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文件时保证每次生成的文件名不同