2013-11-27 51 views
0

。嗨,我需要在的Tasklist在不同的线程中运行每个任务,并且当每个T完成时,请执行something而不打扰主程序或其他线程。 [我不能改变myTask.runTask()方法]线程设计时需要两个:等待并继续

你能告诉我正确的设计吗?

foreach (myTask T in this.TaskList) 
{ 
    if (T.NextRunTime<=Now); 
     new Thread(() => T.runTask()).Start(); //When done: Do 'something'... 
     //do more stuff     
} 

感谢

回答

1

试试这个

class Program 
    { 
    static List<Task> allTasks = new List<Task>(); 
    static void Main(string[] args) 
    { 
     foreach (myTask T in this.TaskList) 
      { 
     if (T.NextRunTime<=Now); 
       var task= Task.Factory.StartNew(() => T.runTask().Start()); 
       task.ContinueWith(delegate 
               { 
                //code for your continuation 
                //you can call the method for doing this 
               },TaskContinuationOptions.NotOnFaulted); 

       try 
       { // and here to handle all your exceptions 
        task.Wait(); 

       } 
       catch (AggregateException ae) 
       { 

        ae.Handle((x) => 
        { 

         return true; 
        }); 

       } 
      } 
     //you can even try someting like this 
     // Task.WaitAll(allTasks.ToArray()); 
    } 
} 
+0

嘿,@BRAHIM Kamel。我用你的解决方案,它看起来像它的工作。问:“任务”工作异步? – Yaron

+0

所以请将它标记为有帮助 –

+0

是的它就像在.NET 4.5中引入的异步等待概念 –

-1
var threads = this.TaskList 
    .Where(t => t.NextRunTime <= Now) 
    .Select(t => new Thread(() => { t.runTask(); /* Do 'something' */ })) 
    .ToList(); 

threads.ForEach(t => t.Start()); 
threads.ForEach(t => t.Join()); 
//do more stuff (all threads finished) 
+0

感谢@Jakub Konecki。如果我想“没有等待任何线程”“做更多的事情”,我只需要删除Join循环,对吧? – Yaron

+0

@Yaron - 是的,您可以在循环之前移动它,以便在其他线程启动后立即执行 –

+0

使用TPL来管理任务要好得多。当然,你可以一次启动多个线程;但是TPL会限制线程的创建,所以如果没有足够的内核/ cpus来处理线程,您不会一次创建所有线程。即如果创建的线程数多于核心线程数,则会引入上下文切换,并使其运行速度比使用较少线程时慢。 –

1

使用Task一起.ContinueWith(...)调用指定代码的任务的执行完成后,执行

 foreach (myTask T in this.TaskList) 
     { 
      if (T.NextRunTime<=Now) 
      { 
       var task = new Task(T.runTask()); 
       task.ContinueWith(<Action to execute on task completion>); 
       task.Start(); 
      }     
     } 
1

刚开始以为每个任务新Task你想要运行,然后使用WhenAll在全部运行时执行代码。

var tasks = TaskList.Where(task => task.NextRunTime <= Now) 
    .Select(task => Task.Run(() => task.runTask())); 

task.WhenAll(tasks) 
    .ContinueWith(t => { 
     //do stuff 
    }); 
相关问题