2013-02-13 118 views
0

我想在下面完成每个任务时更新进度条。检测每个任务何时完成

的方法VAR continuation2 = Task.Factory.ContinueWhenAny(.....不工作。

什么是做这种正确的方法是什么?

C#代码

private void radButtonInsertManyErrors_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       radProgressBarStatus.Maximum = int.Parse(radTextBoxNumberofErrorsInsert.Text); 
       radProgressBarStatus.Value1 = 0; 


       Task<int>[] tasks = new Task<int>[int.Parse(radTextBoxNumberofErrorsInsert.Text)]; 

       for (int i = 0; i < int.Parse(radTextBoxNumberofErrorsInsert.Text); i++) 
       { 
        int x = i; 
        tasks[i] = new Task<int>(() => 
        { 

         //insert the error into table FA_Errors 
         Accessor.Insert_FAErrors(BLLErrorCodes.BLL_Error_Codes.Error_Log_Event_Login.ToString(), 
                (int)BLLErrorCodes.BLL_Error_Codes.Error_Log_Event_Login, 
                "Some Error", "", 
               MethodBase.GetCurrentMethod().DeclaringType.Namespace.ToString(), 
               MethodBase.GetCurrentMethod().Name.ToString(), 
               BLLErrorCategory.BLL_Error_Category.WEB_APP.ToString(), 
               "pc source", "damo", 
               sConn.ToString()); 
         return 1; 


        }); 
       } 

       var continuation = Task.Factory.ContinueWhenAll(
          tasks, 
          (antecedents) => 
          { 
           RadMessageBox.Show("Finished inserting errors "); 
          }); 


       var continuation2 = Task.Factory.ContinueWhenAny(
       tasks, 
       (antecedents) => 
       { 
         radProgressBarStatus.Value1++; 

       }); 


       for (int i = 0; i < int.Parse(radTextBoxNumberofErrorsInsert.Text); i++) 
        tasks[i].Start(); 
       // Use next line if you want to block the main thread until all the tasks are complete 
       //continuation.Wait(); 


      } 
      catch (Exception ex) 
      { 

       MessageBox.Show(ex.Message.ToString()); 

      } 

     } 

回答

4

您可以使用此功能:

public static void TaskProgress(IEnumerable<Task> tasks, Action<int> callback) 
{ 
    int count = 0; 
    foreach (var task in tasks) 
     task.ContinueWith(t => callback(Interlocked.Increment(ref count))); 
} 

将每一项任务的完成当前任务数完成时调用回调。请注意,回调不是同步的,因此可以在前一个回调仍在运行时调用回调。

+0

我该如何调用该方法? – user1438082 2013-02-13 21:10:18

+1

@ user1438082'TaskProgress(tasks,count => Invoke(new MethodInvoker(()=> radProgressBarStatus.Value1 = count)));' – Servy 2013-02-13 21:13:57

+0

我得到错误“System.Windows.Forms.Control的最佳重载方法匹配.Invoke(System.Delegate,params object [])'有一些无效参数“插入这行代码后 – user1438082 2013-02-13 21:25:31

2

设置每个任务的延续时间,在完成每项任务时保持一个(线程安全)计数器的完成和更新UI。

其实,Task.WhenAll的确保持这样一个柜台。它只是无法访问。

+0

因此,如果我有1000个任务 - 那么我必须创建1000个连续? – user1438082 2013-02-13 21:03:48

+2

@ user1438082是的。这需要完成。有一些功能为你做它只会隐藏它,不会阻止它发生。 – Servy 2013-02-13 21:06:50

+0

延期费用相对便宜。肯定比任务要便宜得多,因此任务机构的成本掩盖了延续的成本。 – usr 2013-02-13 21:20:27