Как правильнее дождатся условно бесконечно Task цикла, если он создается в конструкторе класса?
Задача предполагает что в конструкторе класса будет вызван Task, который с точки зрения бизнес логики должен жить в течение всего жизненного цикла приложения. Но также логика требует убедится, что Task не завершился с исключением. Хотелось также получать исключение наиболее естественным образом. Как решаются подобного рода задачи?
public class Example
{
internal async Task taskExample()
{
int count = 0; // тут она очевидно конечная
while(true)
{
if (count == 3) throw new InvalidOperationException(nameof(count));
await Task.Delay(1000);
++count;
}
}
public Example()
{
Task task = taskExample(); // Задача старутет. Как её ожидать если она бесконечна ?
}
}
Ну например можно примерно как то так.
List<Task> tasks = new List<Task>();
Thread thread = new Thread(() =>
{
while (true)
{
foreach (var item in tasks)
{
if (item.IsFaulted is true)
{
if (item.Exception is null) continue;
else
{
throw item.Exception;
}
}
}
}
});
thread.IsBackground = true;
thread.Start();
Если рассматривать обработку исключений в Task, то вроде некоторые исключения не удастся так обработать.
UPD
В моем пэт проекте метод на самом деле является обёрткой на событием. И обычно когда подписываешься это выглядит примерно так. И как то упускаешь момент.
TrayIcon._notifyIcon.MouseClick += NotifyIcon_MouseClick
Я вообще то запамятовал что async void не блокирует поток. И он допустим для событий. А где он плох можно почитать по ссылке ниже.
Скрин из пэт проекта. Просто хотел попробовать в реактивном стиле.
Проверил исключения вроде не теряются. И то что их не получится обработать привычным способом не принципиально. Главное что они не потеряны.
