2013-05-26 32 views
2

我试图连续运行多个任务,不停。 这里是我的代码:C#:使任务同时运行

int maxThread = 100; 
Task[] tasks = new Task[maxThreads]; 
while(true) 
{ 
    for(int i = 0;i<maxThreads;i++) 
    { 
    tasks[i] = new Task.Factory.StartNew(someTask); 
    } 
    Task.WaitAll(tasks); 
} 

所以这个函数等待完成所有任务并运行下一批次任务。但是我希望在完成任务后立即开始任务,而不必等待其他任务。

谢谢!

+0

@Ramhound,我想你是错的。任务负责管理他们自己的线程。你不应该在不同的线程中启动每个任务。 –

回答

8

我会用SemaphoreSlim

int maxThread = 100; 
SemaphoreSlim sem = new SemaphoreSlim(maxThread); 

while (true) 
{ 
    sem.Wait(); 
    Task.Factory.StartNew(someTask) 
       .ContinueWith(t => sem.Release()); 
} 

使用Parallel.ForEachvar po = new ParallelOptions(){MaxDegreeOfParallelism = 100};可以是其他的选择。但Parallel.ForEach不保证它将使用100个任务。

+0

所以我不需要运行循环来运行100个线程? – Capripio

+1

@Capripio不,因为信号量用于限制并发任务的数量为100. – Dirk

+0

所以我可以这样写我: 'int maxThread = 100; SemaphoreSlim sem =新的SemaphoreSlim(maxThread);任务[]任务=新的任务[maxThreads]; 而(真) { 对(INT I = 0; I sem.Release()) ; } Task.WaitAll(tasks); }' – Capripio

0

我想使用这个。将任务附加到其父项;这很容易。喜欢这个。

Task t1 = new Task(()=>{ 
    // put your children tasks here. 
    Task.Factory.StartNew(()=>{}, TaskCreationOptions.AttachedToParent); 
}); 

t1.RunSynchronously(); 

// then start your next batch tasks. 
+0

为什么在这个解决方案中所有的兄弟姐妹都结束之前,任务会开始? –

+0

他可能会批量执行短期运行任务以按订单运行。 – Howard