Скажу, у меня есть два независимых асинхронная функция (что я не контролирую), которые создают объекты Задачи:Как связать независимые задачи C#?
Task A();
Task B();
и некоторые другие функции, не асинхронной
void X();
Как построить один Целевая цепочка, выполняющая все эти последовательности и позволяющая добавлять дополнительные продолжения (которые будут выполняться после X)?
Если я это сделать:
Task Sequential()
{
return A()
.ContinueWith(t => { B(); })
.ContinueWith(t => { X(); });
}
, что не работает, потому что B начинает новую целевую цепочку. Если B занимает много времени, X будет выполнен первым (вместе с тем, что еще может вызвать вызывающий из SequentialWith на возвращаемой Задаче). Мне нужно, чтобы X был последним элементом в одной цепочке задач, а задача B - его прецедент.
Если я делаю это:.
Task Sequential()
{
return A()
.ContinueWith(t => { B().ContinueWith(t => { X(); }); });
}
, что лишь частично решает эту проблему, потому что даже если A, B и X теперь будет выполняться в последовательном порядке, если вызывающий абонент делает Sequential() ContinueWith, что продолжение будет выполняться параллельно с B и X, а не после X.
ответ Алекса так, как вы хотели бы пойти. Но для ваших целей то, что вы пытаетесь выполнить, потребует использования обещания (которое 'TaskCompletionSource' служит). –
Не является ли 'Task.WaitAll (A(), B()). ContinueWith (t => X())' вариант, если вы говорите, что 'A' и' B' являются независимыми? – VMAtm
@VMAtm, вы имеете в виду 'Task.WhenAll'. –