★★★送分快来抢★★★:写了个windows service,如何提供性能?在线等.

解决方案 »

  1.   

    我每50秒看有没有工作任务,有的话就开启一个线程运行任务,有可能同一时间有多个任务,现在的问题是不管有多少个工作任务,总是等上一个工作任务完后,再运行下一个工作任务.代码如下:
    if (null != taskList)
                {
                    DateTime lastMaxTime;                
                        //执行每一个任务
                        foreach (DataCheckTaskInfo job in taskList)
                        {
                            lastMaxTime = job.LastMaxTime;                        ThreadStart myThreadDelegate = new ThreadStart(job.RunTask);
                            Thread myThread = new Thread(myThreadDelegate);
                            //myThread.IsBackground = true;    
                            
                            myThread.Start();
                            //Thread.Sleep(300);
                            TimeSpan lastTime = new TimeSpan(lastMaxTime.Hour, lastMaxTime.Minute, lastMaxTime.Second);
                            if (!myThread.Join(lastTime))
                            {
                                myThread.Abort();
                                
                            }                    }                
                }
      

  2.   

    有没方法同时并行运行多个任务,任务a没完成,任务b到时间要运行了,能否任务a即使没完成,任务b也要开始运行?
      

  3.   

    比如我现在有3个任务(a,b,c)都设置在8点整运行,我设置了Thread.Sleep(0);没效果,
    任务a 8点整开始运行了,但任务b,c在8点整运行不了,哪怕任务a 启动几秒后也不行,一定要等任务a运行完后,任务b,c才会运行
      

  4.   

    using System;
    using System.Threading;class A
    {
        public void Show()
        {
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(100);
                Console.WriteLine("n = " + i.ToString());
            }
            
        }
        public void Show1()
        {
            for (int i = 10; i < 20; i++)
            {
                Thread.Sleep(100);
                Console.WriteLine("n = " + i.ToString());
            }
        }
        public void Show2()
        {
            for (int i = 20; i < 30; i++)
            {
                Thread.Sleep(100);
                Console.WriteLine("n = " + i.ToString());
            }    }    static void Main(string[] args)
        {
            A a = new A();
            Thread thr;
            thr = new Thread(new ThreadStart(a.Show));
            thr.Start();
            thr = new Thread(new ThreadStart(a.Show1));
            thr.Start();
            thr = new Thread(new ThreadStart(a.Show2));
            thr.Start();
            Console.Read();
        }}
    ------------------------------------------
    你跑一下这个 consoleApplication看一下结果
      

  5.   

    这个可以证明 线程对象被new之后还会继续跑完 因为并没有 Abort 它
      

  6.   

    TO:
    比如我现在有3个任务(a,b,c)都设置在8点整运行,我设置了Thread.Sleep(0);没效果,
    任务a 8点整开始运行了,但任务b,c在8点整运行不了,哪怕任务a 启动几秒后也不行,一定要等任务a运行完后,任务b,c才会运行这个应该不会吧..线程就应该是并发的,虽然并不是严格意义上的并发(也就是说A,B,C不可能在同一时刻都在运行),但每个线程都会分有一定的时间片,应该不可能出现你的说"一定要等任务a运行完后,任务b,c才会运行"
      

  7.   

    刚看了下你的代码,写得确实有点问题:你的本意是根据任务数来循环启动几个线程,但是为什么会出现你所谓的"一定要等任务a运行完后,任务b,c才会运行"?原因就出在:if (!myThread.Join(lastTime))
                            {
                                myThread.Abort();                            
                            }
    也就是说你启动第一个线程后,执行到这条语句时,它会等待lastTime这么长时间,在这段时间里如果线程执行完,则myThread.Join(lastTime)会返回true,否则返回false,此时你将其"Abort"..不论怎么说每当你开启一个线程执行到这条语句,都会等待lastTime这么长时间,然后才会进行下一次循环,即开启下一条线程,可能在这段时间内,你的第一个线程(a)已经执行完成..由此可见,你所谓的"一定要等任务a运行完后,任务b,c才会运行"的现象不言而喻...
      

  8.   

    to muyanpeng_mail:
    是的,但怎么解决下面的问题?
    如我前面写的代码,taskList有2个任务(a,b),循环建立新线程分别启动每个任务,但任务a的线程启动后(myThread.Start();),如何使任务b的线程也启动,我在job.RunTask里设置Thread.Sleep(0);没用.  现在的问题是任务a的线程启动后,一直要等任务a完成后才启动任务b的线程
      

  9.   

    to liujia_0421():
    if (!myThread.Join(lastTime))
                            {
                                myThread.Abort();                            
                            }
    这段代码的意思是如果这个线程运行超过规定的运行时间,强制关掉此线程
      

  10.   

    TO:
    这段代码的意思是如果这个线程运行超过规定的运行时间,强制关掉此线程我知道,你不是一直在问为什么"任务a的线程启动后,一直要等任务a完成后才启动任务b的线程"吗?原因就出你的这句代码里了...对于public bool Join (
    TimeSpan timeout
    )
    如果线程已终止,则为 true;如果线程在经过了 timeout 参数指定的时间量后未终止,则为 false。举个例子,循环的第一次你创建了线程a,执行到此语句时,它会检查线程a是否已结束,如果没有结束,它会等待,直到线程a结束,如果等待了lastTime这么长时间,线程a还没有结束,会调用你的myThread.Abort();来强制关掉线程...然后再进行下一次循环,即创建下一个线程b..总之,只有线程a结束后(自动结束,或者被强制关掉),纯程b才会被创建...
      

  11.   

    归根结底,问题就出在join了,至少join放的地方不对,不应该放在循环里面...否则就不会出现几个线程并发的效果 ...
      

  12.   

    re:是的,但怎么解决下面的问题?
    如我前面写的代码,taskList有2个任务(a,b),循环建立新线程分别启动每个任务,但任务a的线程启动后(myThread.Start();),如何使任务b的线程也启动,我在job.RunTask里设置Thread.Sleep(0);没用.  现在的问题是任务a的线程启动后,一直要等任务a完成后才启动任务b的线程----------------------------------------------------------------liujia_0421() 说的
    刚看了下你的代码,写得确实有点问题:你的本意是根据任务数来循环启动几个线程,但是为什么会出现你所谓的"一定要等任务a运行完后,任务b,c才会运行"?原因就出在:if (!myThread.Join(lastTime))
                            {
                                myThread.Abort();                            
                            }
    也就是说你启动第一个线程后,执行到这条语句时,它会等待lastTime这么长时间,在这段时间里如果线程执行完,则myThread.Join(lastTime)会返回true,否则返回false,此时你将其"Abort"..不论怎么说每当你开启一个线程执行到这条语句,都会等待lastTime这么长时间,然后才会进行下一次循环,即开启下一条线程,可能在这段时间内,你的第一个线程(a)已经执行完成..由此可见,你所谓的"一定要等任务a运行完后,任务b,c才会运行"的现象不言而喻...
    --------------------------------------------------------------------------
    问题好像就是出在这里
      

  13.   

    最简单的解决办法就是
    ThreadStart myThreadDelegate = new ThreadStart(job.RunTask);
    Thread myThread = new Thread(myThreadDelegate);            
    myThread.Start();
    TimeSpan lastTime = new TimeSpan(lastMaxTime.Hour, lastMaxTime.Minute, lastMaxTime.Second);
    if (!myThread.Join(lastTime))
    {
             myThread.Abort();                           
    }
    把上面这些 在写到一个线程里(线程里开线程)
      

  14.   

    多cpu如何把等待线程放在其他空闲的cpu里运行,我的服务器有8个cpu
      

  15.   

    re:多cpu如何把等待线程放在其他空闲的cpu里运行,我的服务器有8个cpu
    ------------------------------------------------------------
    这个好像想多了