using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static Task Start()
{
TaskCompletionSource taskCompletionSource = new();
Process process = new()
{
StartInfo = new ProcessStartInfo(@"program.exe"),
EnableRaisingEvents = true,
};
process.Exited += (object? sender, EventArgs args) =>
{
Console.WriteLine("Процесс завершен");
try
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
taskCompletionSource.SetResult();
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
}
catch
{
Console.WriteLine("Ошибка!");
}
Console.WriteLine("Событие завершено");
};
process.Start();
return taskCompletionSource.Task;
}
public static async Task Main(string[] args)
{
await Start();
Console.WriteLine("Выполняется продолжение");
throw new Exception();
}
}
Написал простой код, который ждет завершение процесса, использовал для этого TaskCompletionSource. Я использую консольное приложение, поэтому контекста синхронизации нет.
Как известно, SetResult запускает код (после await Start()) синхронно в потоке который обрабатывал событие (так как я не использую TaskCreationOptions.RunContinuationsAsynchronously).
В этом продолжении кода мы вызываем исключение
1) Почему его не перехватывает наш try catch, почему исключение не может найти блок catch когда раскручивает стек?
2) Почему оба вывода
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Одинаковы, ведь по сути, поток после вызова SetResult падает, но каким то образом он выполняет код после SetResult
3) Если происходит упаковка исключения в Task, то в какой момент мы await-им этот task, чтобы наше исключение было выброшено?
Заранее спасибо