Я пытаюсь немного поиграть с асинхронным/ожиданием/продолжением C#. Моя цель состоит в том, чтобы иметь две задачи, которые работают параллельно, хотя какая задача выполняет последовательность действий по порядку. Для этого я планировал иметь List<Task>
, которые представляют задачи 2 (или более), выполняющиеся параллельно, и использовать ContinueWith
для каждого из Task
. Моя проблема заключается в том, что обратный вызов в продолжении, похоже, не выполняется, пока await taskList
уже вернулся.Использовать асинхронный обратный вызов с помощью Task.ContinueWith
Для того, чтобы подвести итоги, вот пример, чтобы проиллюстрировать то, что я ожидал случиться:
class Program
{
static public async Task Test()
{
System.Console.WriteLine("Enter Test");
await Task.Delay(100);
System.Console.WriteLine("Leave Test");
}
static void Main(string[] args)
{
Test().ContinueWith(
async (task) =>
{
System.Console.WriteLine("Enter callback");
await Task.Delay(1000);
System.Console.WriteLine("Leave callback");
},
TaskContinuationOptions.AttachedToParent).Wait();
Console.WriteLine("Done with test");
}
}
Ожидаемый результат будет
Enter Test
Leave Test
Enter callback
Leave callback
Done with test
Однако выход
Enter Test
Leave Test
Enter callback
Done with test
Есть ли способ сделать задачу, на которой вызван ContinueWith
, дефокусировать функцию, прежде чем считаться выполненной? то есть. .Wait будет ждать обе задачи, которые будут завершены, оригинал, и тот, который возвращается ContinueWith
Попробуйте удалить 'await' из' await Task.Delay (1000); ' –
Действительно, это сработало. Я убрал ожидание, и асинхронно, так как ничего не ждет. Однако мне не хватает причины для его работы. У вас есть теоретическое объяснение? – chouquette
Появляется сообщение «Leave callback» после «Done with test»? –