Рекурсивный поток управления задачамиC#

Место общения программистов C#
Ответить
Anonymous
 Рекурсивный поток управления задачами

Сообщение Anonymous »

Когда я раскомментирую await Task.Delay(1_000);, foo.DoAsync внутри Task.Run становится Task.CompletedTask, поскольку он ожидает Task.Run< /code> накладные расходы. Поэтому он работает нормально.
Когда я комментирую await Task.Delay(1_000);, foo.DoAsync внутри Task.Run — это сам собой. После первого попадания в точку останова2 в режиме отладки точка останова2 больше не попадает.

Код: Выделить всё

internal class Foo
{
public Task DoAsync { get; set; }

public void Recursive()
{
// Breakpoint1
Recursive();
}
}

Код: Выделить всё

var foo = new Foo() { DoAsync = Task.CompletedTask };

//foo.Recursive();

Console.WriteLine($"Outer ThreadId: {Environment.CurrentManagedThreadId}");

var task = Task.Run(async () =>
{
Console.WriteLine($"Inner ThreadId: {Environment.CurrentManagedThreadId}");
// Breakpoint2
await foo.DoAsync;
Console.WriteLine("""
******
******
******
done
******
******
******
""");
});

await Task.Delay(1_000);

foo.DoAsync = task;

await foo.DoAsync;
Я ожидал, что он будет бесконечно достигать точки останова 2, поскольку foo.Recursive будет бесконечно достигать точки останова 1, пока не произойдет сбой. Куда направляется поток управления после первого попадания в точку останова2?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ntrol-flow
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»