Код: Выделить всё
using System;
using System.Threading;
using System.Threading.Tasks;
static class Program {
static TaskCompletionSource tsc;
static async Task F1(int i) {
// PART 1
await tsc.Task;
// PART 2
Console.WriteLine($"call: {i}, thread: {Thread.CurrentThread.GetHashCode()}");
}
static async Task Main() {
tsc = new();
var tasks = new Task[5];
for(int i = 0; i < tasks.Length; i++)
{
F1(i);
}
tsc.SetResult();
Console.WriteLine("what?!");
//await Task.Yield();
Console.WriteLine("done");
}
}
Но текущий код выполняется следующим образом:
Код: Выделить всё
call: 0, thread: 1
call: 3, thread: 21
call: 1, thread: 17
call: 2, thread: 20
what?!
done
call: 4, thread: 19
- Но в настоящее время кажется, что все асинхронные задачи продолжают выполнение в разных потоках, в этом нет необходимости «Task.Run» для этого. Правильно ли это предположение?
- Есть ли какой-либо способ заставить поведение, которое я ожидал, что все асинхронные задачи выполняются только в основном потоке, только если я дайте им «время простоя» (любое последующее ожидание, например: «Task.Yield» или «Task.Delay»).
Подробнее здесь: https://stackoverflow.com/questions/784 ... t-task-run
Мобильная версия