0

以下の各タスクが完了すると、プログレスバーを更新したいと思います。

メソッドvarcontinuation2= 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 に答える