我使用Progress在Winforms应用程序中报告任务操作。我不确定如何报告任务标识,以便UI可以相应地执行操作,即,如果任务1返回结果,则将项添加到标签页1,如果任务2返回结果,则将项添加到标签页2。
我正在使用foreach循环来创建任务,这些任务都做同样的事情。我需要基于创建任务时的顺序的任务标识,即,当创建第一个任务时,UI知道它的任务1"报告信息,等等。根据循环次数创建任务数,循环次数可能会发生变化。
起初我认为Task.Id可用于识别任务。但是根据MSDN,任务ID是按需分配的,并不一定代表创建任务实例的顺序。并且不保证任务标识符是唯一的。
我使用此tutorial中指示的Progress
。
答案 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 });
}
}