2013-11-27 90 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 
    }); 
相關問題