2013-05-27 97 views
0

我有一個執行方法的子任務數組,一旦作業完成,我得到一個通知並結束。現在我希望他們再次重新開始相同的工作,沒有任何麻煩。這怎麼可能?完成後重新啓動陣列中的所有任務

這是我如何創建任務陣列,並與任務完成的工作:

public void Start() 
     { 

      this.totalRangePerThread = ((this.endRange - this.startRange)/this.subTasks.Length); 

      for (int i = 0; i < this.subTasks.Length; ++i) 
      { 
       var copy = startRange; 
       this.subTasks[i] = new Task(() => searchItem(copy, this.totalRangePerThread), this.token, TaskCreationOptions.LongRunning); 
       this.startRange = this.startRange + this.totalRangePerThread; 
      } 

      //start tasks 
      for (int taskIndex = 0; taskIndex < this.subTasks.Length; ++taskIndex) 
      { 
        this.subTasks[taskIndex].Start();  
      } 
      Task.Factory.ContinueWhenAll(this.subTasks, completedTasks => 
      { 
       //write it onto the the activitylog 
       if (Form1.Instance != null) 
       { 
        Form1.Instance.BeginInvoke((MethodInvoker)delegate 
        { 
         Form1.Instance.AddItemtoActivityLog("Search Completed!"); 
        }); 
       } 
      }); 

     } 

我應該撥打另一個電話到Start()方法還是有,只是奇蹟般地重新啓動子任務的機制?

+1

一個簡單的調用start()不會傷害太大,:) – David

+0

@大衛,這是我的第一張照片吧。但它沒有按預期工作。 – faizanjehangir

+0

嘗試Task.WaitAll(),然後調用start(); – David

回答

1

您可以將用於準備和執行子任務的代碼提取到單獨的方法中。然後在您的Start()方法調用它兩次:裏面ContinueWhenAll

private void ExecuteSubTasks() 
{ 
    var tasks = new Task[] 
     { 
      new Task(() => Console.WriteLine("SubTask1 executed.")), 
      new Task(() => Console.WriteLine("SubTask2 executed.")), 
      new Task(() => Console.WriteLine("SubTask3 executed.")), 
     }; 

    foreach (var task in tasks) 
     task.Start(); 
    Task.WaitAll(tasks); 
} 

private void Start() 
{ 
    var mainTask = Task.Factory.StartNew(() => ExecuteSubTasks()) 
     .ContinueWith((prev) => 
     { 
      ExecuteSubTasks(); 
      this.Invoke((MethodInvoker)delegate { MessageBox.Show("Completed."); }); 
     }); 
} 
+0

非常緊湊和可行。非常感謝! – faizanjehangir

1
public void Start() 
{ 
    var yourTasks = new Task[] { 
    Task.Factory.StartNew(_ => task1(), 
    Task.Factory.StartNew(_ => task2(), 
    Task.Factory.StartNew(_ => ... 
    Task.Factory.StartNew(_ => taskN() }; 
    Task.WaitAll(yourTasks); // wait for all N tasks to complete 
    Start(); 
} 
+0

'waitall'還有'waitall'嗎? – faizanjehangir

+0

'waitall'命令暫停UI ..我確實需要這個,有沒有圍繞這部分的工作? – faizanjehangir

+1

waitall命令暫停UI?你在調用UI的線程嗎?如果是這樣,從新線程調用Start()並不困難,但這與您的原始發佈無關! – David

相關問題