检测每个任务何时完成

时间:2013-02-13 20:37:08

标签: c# task-parallel-library task

我想在下面完成每项任务时更新进度条。

方法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());

            }   

        }

2 个答案:

答案 0 :(得分: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)));
}

每次任务完成时,它将使用当前已完成任务的数量调用回调。请注意,回调未同步,因此可以在前一个回调仍在运行时调用它。

答案 1 :(得分:2)

为每个任务设置延续。保持(线程安全)计数器完成每个任务的完成次数和更新UI。

实际上,Task.WhenAll确实存在这样的反击。它只是无法访问。