要求:
做一个窗体程序,当运行的时候,当到了一定时间自动生成excel。
1.根据要求生成excel的方法已经基本没有问题。
2.有的excel是每晚8:00 pm或11:59 pm 生成,有的excel是每个星期周末生成,有的是每个月底生成。关于上次,计时解决了,新问题出来了。同一时间可能生成多个excel,但是有的excel时间会比较长。程序容易发生死锁。
我考虑到 线程和线程池 。
最后觉得采用线程池更合理,但因为之前没接触这方面,找了几天资料,都没有头绪。
还有一点:不同时间点,都是在一个线程池里操作吗?还是一个时间点一个线程池?
希望大家能提供点实用的例子参考下 谢谢了

解决方案 »

  1.   

    http://blog.csdn.net/jjjjj102310253/archive/2008/01/18/2051166.aspx
      

  2.   

    你这点点操作线程和线程池没多大差别,区别就在自己管理和线程池管理线程。你把生成excel的代码写到一个函数里面 ,每一次保存Excel就开一个线程丢到线程池,或者自己管理。
    当SaveExcel方法执行完后销毁线程(线程池你就不用管了,他自己会处理。)SaveExcel(obj parms)
    {
        DataTable table= (DataTable)parms;
        //根据穿过来的table 生成Excel。
    }
      

  3.   


    我估计他的意思是生成EXCEL时使用线程生成
      

  4.   


    无语了你设计有问题。
    1:使用time控件实现计划任务
    2:生成是使用线程执行生成Excel并保存的操作,避免界面假死。
      

  5.   


    我是用的timer控制时间....
    也知道需要使用线程
    只是......
    线程这方面不会用  很多资料  但看不明白...
      

  6.   

    还有 我使用的是VS2003...
    希望大家帮帮忙  资料查了几天  大多转回到微软的那个demo上面了
      

  7.   

    public void StartSave(DataTable dt)
    {
    Thread myThread = new Thread(new ParameterizedThreadStart(ThreadMethod));
    myThread.Start(dt);//这是传进去的数据table,在这里给他负值。
    }
    //ThreadMethod ,
    public void ThreadMethod(object ParObject)
    {
        //    生成Excel}//在你生成事件里面调用StartSave ,这个方法执行完后线程他会自动销毁
      

  8.   

    VS2003 没有ParameterizedThreadStart委托....
      

  9.   


    这是是从VS2005才加进去的,so  我就悲剧了  
    不然之前就用了
      

  10.   

    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 ,这个方法执行完后线程他会自动销毁
      

  11.   

    myThread.Start();
    执行完了就自动销毁?
    那每个生成excel就需要写一个ThreadMethod()?
    具体生成的excel是他们以前写好的老方法...
      

  12.   

    把生产Excel的代码做成单例,传入Datatable和日期。
    这样每次只有一个Excel生产在操作。
      

  13.   

    这个方法执行完了后,这个线程没任务了,他就会自动销毁。估计是垃圾回收机制做的。
    只要一个方法就行啊,每次开启线程前给 dt 赋值。把他ThreadMethod替换成你的老方法
      

  14.   


    TreadStart()委托如何传入table的?
    start()方法里不能带入参数
      

  15.   

    DataTable dt=new DataTable();
    public void StartSave(DataTable dtTmp)
    {
    dt= dtTmp;我声明了一个全局的dt
      

  16.   


    恩 是吧  大姐的脸很阴沉啊!是不是这样的...Thread myThread1 = new Thread(new ThreadStart(ThreadMethod1));
    Thread myThread2 = new Thread(new ThreadStart(ThreadMethod2));
    .
    .
    .
    myThread1.start();
    myThread2.start();
    .
    .
    我说的意思是线程是这样的吗
    如果是这样,我就把这一套封装成方法,带入不同的生成方法替换ThreadStart里面的...
      

  17.   

    你把你time控件的触发事件代码贴出来吧,我们给你写了
      

  18.   

    那 大叔 如何判断线程已经完成  因为我要写log文件...
      

  19.   

    生成完文件,不就是完成了嘛...void ThreadMethod1 ()
    {
        // 生成文件...
        // 报告进度...
    }
      

  20.   


    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();
    }   }这个写的测试下的
    哎 太菜了  又纠结了一天...
      

  21.   


    你的time控件事件除非间隔多少 ?如果是秒,我估计你11:24分内要触发很多次吧  ?
    你把time控件触发间隔设置成 61S,再象你上面这么写
      
      

  22.   

    是啊 我就在想这问题  回答惊为天人啊 点醒了...
    另外出了点问题 呵呵 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)报错  这里该怎么写呀...
      

  23.   

    //time检测时间执行生成方法
    //生成方法
    {
         lock(this)
         {
              //方法体
         }
    }
      

  24.   


            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文件时保证每次生成的文件名不同