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

2 回答 2

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

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

于 2013-02-13T21:03:38.550 回答
2

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

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

于 2013-02-13T20:48:28.797 回答