Итак, если у вас есть какое-то перечисляемое число Action
делегатов или что-то, что вы хотите сделать, вы можете легко использовать LINQ для выполнения следующих действий:
// Create the base task. Run synchronously.
var task = new Task(() => { });
task.RunSynchronously();
// Chain them all together.
var query =
// For each action
from action in actions
// Assign the task to the continuation and
// return that.
select (task = task.ContinueWith(action));
// Get the last task to wait on.
// Note that this cannot be changed to "Last"
// because the actions enumeration could have no
// elements, meaning that Last would throw.
// That means task can be null, so a check
// would have to be performed on it before
// waiting on it (unless you are assured that
// there are items in the action enumeration).
task = query.LastOrDefault();
Приведенный выше код действительно является вашим цикломПросто в причудливой форме.Он делает то же самое в том, что он берет предыдущую задачу (после того, как заполнен фиктивным «noop» Task
), а затем добавляет продолжение в виде ContinueWith
(назначая продолжение текущей задаче в процессе дляследующая итерация цикла, которая выполняется при вызове LastOrDefault
).