В ожидании задачи, складывающегося из двух потоковC#

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

Сообщение Anonymous »

Мне было интересно, что произойдет, если вы ожидаете задачи, который completionionsource из двух потоков.using System.Diagnostics;

var t = Start();
var t1 = Task.Run(async () => {
await t;
Thread.Sleep(TimeSpan.FromSeconds(2));
Print($"task1");
});
var t2 = Task.Run(async () => {
await t;
Thread.Sleep(TimeSpan.FromSeconds(4));
Print($"task2");
});
await Task.WhenAll(t1, t2);
Print($"end");
Console.ReadLine();

static Task Start()
{
var taskCompletionSource = new TaskCompletionSource();

Process process = new()
{
StartInfo = new ProcessStartInfo(@"notepad"),
EnableRaisingEvents = true
};
process.Exited += (object? sender, EventArgs args) =>
{
Print("one");
taskCompletionSource.SetResult();
Print("two");
};
process.Start();

return taskCompletionSource.Task;
}

static void Print(string msg) => Console.WriteLine($"[{Environment.CurrentManagedThreadId}] - {msg}");
< /code>
Выходы: < /p>
[6] - one
[4] - task1
[6] - task2
[6] - end
< /code>
Но иногда выход: < /p>
[4] - one
[4] - task1
[4] - two
[6] - task2
[6] - end
< /code>
Итак, кажется, что когда Setresult видит, что мы ожидаем нашего задачи в двух местах одновременно, иногда он ведет себя по -разному. На втором выходе он проходит первое продолжение того же потока, которое называлось SetResult (Thread [4]), в то время как второе продолжение запланировано на потоке из пула потоков (поток [6]), который, по -видимому, происходит случайным образом.
, но в других случаях, по какой -то причине (как и в первом выходе), кажется, что оба продолжения завершат, прежде чем выполнять код, который следует за вызовом. Мне интересно, почему. < /P>
Как работает эта логика? Почему оба результата возможны?

Подробнее здесь: https://stackoverflow.com/questions/797 ... wo-threads
Ответить

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

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

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

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

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