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

时间:2017-09-27 17:01:04

标签: c# .net winforms task-parallel-library

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

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

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

我使用此tutorial中指示的Progress

1 个答案:

答案 0 :(得分:0)

我基本上增加了循环内的计数。将该计数传递给我创建的每个任务,并将数字报告给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 });
    }
}