Если потоки запущены и мы их прерываем, то никак нельзя узнать активные потоки.
Хотя в проекте могут быть не завершенные потоки. На сколько мне известно нету метода который бы позволял получить активные потоки, может можно косвенно узнать о запущенных потоках?
Создание/Уничтожение потока не быстрая операция. Созданные потоки похожи на бесконечный автоматы, если их отправить восвояси (не держа с ними связь на поводке, то они могут засесть в памяти), в то время, как главный поток уже закончил свою работу.
Все конечно индивидуально, но что-то да можно придумать...
Можно создать надстройку над пулом (ThreadPoolWorker), в котором есть свойства: Success, Completed и Exception.
Главный поток запускает метод:
public void Start(object state)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadExecution), state);
}
и ожидает асинхронной операции:
public void Wait()
{
while (Completed == false) //если операция не закончилась, ждать...
{
Thread.Sleep(100);
}
if(Exception != null) //если операция закончилась, проверить исключение...
{ //если возникло исключение, сделать проброс, чтобы отловить возникшую проблему...
throw Exception;
}
}
Метод обратного вызова:
private void ThreadExecution(object state)
{
try
{
action.Invoke(state);
Success = true; //закончилась успешно
}
catch (Exception ex)
{
Exception = ex; //записать тип исключения
Success = false; //закончилась неуспешно
}
finally
{
Completed = true; //асинхронная операция завершила свое выполнение
}
}
Реализовав диспетчер ожидания события или DispatcherTimer +
CancellationTokenSource можно отменить операцию.
ThreadPool, минусы:
* Все потоки в пуле потоков являются фоновыми. В случае завершения работы всех приоритетных потоков в процессе работа всех фоновых потоков тоже останавливается. Сделать поток из пула приоритетным не удастся.
* Нельзя изменять приоритет или имя находящего в пуле потока. Все потоки в пуле представляют собой потоки многопоточного апартамента (multi-threaded apartment — МТА), а многие СОМ-объекты требуют использования потоков однопоточного апартамента (single-threaded apartment — STA).
* Потоки в пуле подходят для выполнения только коротких задач. Если необходимо, чтобы поток функционировал все время (как, например, поток средства проверки орфографии в Word), его следует создавать с помощью класса Thread.
* Нельзя создать поток с фиксированной идентичностью, чтобы можно было прерывать его или находить по имени.
Источник: professorweb.ru/my/csharp/thread_and_files/1/1_16.php
Тогда на помощь class Thread или для более гибкой работы с потоками есть class Task, который может использовать так называемое продолжение (ContinueWith), ну и нововведение ValueTask.
По теме:
Обработка исключения
ThreadInterruptedException
Справка:
приостановка и прерывание потоков
Дополнительно:
Прерывание потока
Итог: Из выше перечисленного, видно: Технологий много, какую из них выбрать непонятно.
П.С. Здесь нужна помощь просветленных.
Мне с моим багажом знаний (а он еще очень маленький))), не потянуть.
Приходит на ум:
1) Реализация диспетчер ожидающего событие:
public async static void WaitEvent()
{
await Task.Run(() =>
{
// code
});
}
готовый
вариант от
@Zymlex
2. Создание дополнительного потока, который выполняет основную логику кубика C#:
Предположим, необходимо вызвать метод:
private void DoSomething()
{ ... }
Отработка логики:
ThreadStart asyncMethod = new ThreadStart(DoSomething);
Thread thread = new Thread(asyncMethod);
thread.Start();
или реализовав оболочку для дополнительного потока, логика: Success, Completed, Exception и CancellationToken.
3. Завершение операции или отмена.
Главный поток ожидает завершение операции второго потока или ждет сигнал от диспетчера (ожидающий событие об отмене и оповещает главный поток о немедленном прекращение), а далее сохранение состояния второго потока.
Вроде похоже на правду и выглядит как, кучер с упряжкой лошадей, где все лошадки под контролем.