检测每个任务何时完成

本文关键字:何时完 任务 检测 | 更新日期: 2023-09-27 17:59:26

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

方法var continuation2=Task.Factor.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());
            }   
        }

检测每个任务何时完成

您可以使用此函数:

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)));
}

每次任务完成时,它都会调用回调,其中包含当前已完成的任务数。请注意,回调是不同步的,因此可以在上一个回调仍在运行时调用它。

为每个任务设置一个延续。保留一个(线程安全)计数器,记录完成的次数,并在完成每个任务时更新UI。

事实上,Task.WhenAll确实在引擎盖下面保留了这样一个计数器。它就是无法访问。