如何在启动多个任务后报告进度时识别任务

How to identify task when reporting progress after launching multiple tasks

我使用 Progress 来报告 Winforms 应用程序中的任务操作。我不确定如何报告任务身份,以便 UI 可以相应地采取行动,即,如果任务 1 返回结果,则将项目添加到标签页 1,如果任务 2 返回结果,则将项目添加到标签页 2结果。

我正在使用 foreach 循环来创建任务,它们都做同样的事情。我需要基于创建任务时的顺序的任务标识,即,当创建第一个任务时,UI 知道它是 "task 1" 报告信息,等等。任务的数量是根据循环的数量创建的,可能会发生变化。

起初我以为Task.Id可以用来识别任务。但根据 MSDN ,任务 ID 是按需分配的,并不一定代表创建任务实例的顺序。并且不保证任务标识符是唯一的。

我按照 tutorial 中的指示使用 Progress

我实质上是在循环内增加了一个计数。将该计数传递给我创建的每个任务,并将该数字报告回 UI。这是步骤:

首先,我将计数传递给任务:

//Create the taskId count
int taskId = 0;
//Create a blank list of tasks
List<Task> tasks = new List<Task>();
//Progress instance to show task result when task is still runnning
var progressReport = new Progress<ActionLog>((actionLog) => reportOfficeName(actionLog));
foreach (var datalist in bigDataList) 
{                   
    try
    {
        taskId++; //Increase the count
        Task task = new Task((Object obj) => {
            /// Need to cast the passed in task id to integer
            int id = (int)obj;
            RandomMethod(datalist, progressReport, cancellationToken, _setting, id);

        }, taskId, cancellationToken); //Pass the id into task

        task.Start();
        tasks.Add(task);
    }
    catch (Exception ex)
    {
        if (ex is OperationCanceledException)
        {
            throw new OperationCanceledException("Task cancelled");
        }
        else
        {
            continue;
        }
    }
} 
Task.WaitAll(tasks.ToArray());

然后,获取id,我直接报id:

Private void RandomMethod (List<Data> datalist,IProgress<ActionLog> progress, CancellationToken token, int taskId ){
    foreach (var data in datalist){
        //report the taskId along with other parameters back to UI 
        progress.Report(new ActionLog() { TaskId = taskId });
    }
}