如何在启动多个任务后报告进度时识别任务
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 });
}
}
我使用 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 });
}
}