更新时间:2021-08-21 00:52:02
您可以实现自己的任务队列,并在每个任务完成后继续处理队列,直到队列为空,例如
You could implement your own task queue and just keep processing the queue after each task is complete until it's empty e.g.
using TaskPair = KeyValuePair<Func, object[]>;
...
private Queue<TaskPair> taskQueue;
...
// generate the queue of tasks
this.taskQueue = new Queue<TaskPair>(this.DataGridViewUrg.Rows);
foreach (DataGridViewRow row in this.DataGridViewUrg.Rows)
{
var task = new TaskPair(Run(DrgDataRowInfo(row.Index)), /* params */);
this.taskQueue.Enqueue(task);
}
// initiate queue processing
ProcessNextTask();
....
private void ProcessNextTask()
{
try
{
var item = this.taskQueue.Dequeue();
TaskSpin(item.Key, item.Value);
}
catch(InvalidOperationException)
{
// queue is empty
}
}
....
// Execute task and process next in queue (if applicable)
public TaskSpin(Func asyncMethod, object[] methodParameters)
{
...
asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, methodParameters));
asyncTask.ContinueWith(task =>
{
// Finish the processing update UI etc.
ProcessNextTask();
}
...
}