В настоящее время я заменяю некоторые домашние функции задачи с новой реализацией, используя новую функциональность System.Threading.Tasks, найденную в .net 4.
У меня есть небольшая проблема, хотя, хотя я могу подумать о некоторых решениях, мне бы хотелось, чтобы некоторые советы, на которых, как правило, лучший способ сделать это, и если я где-то упускаю трюк.
Мне нужно, чтобы произвольный процесс мог запустить Task, но затем продолжить и не дождаться завершения задачи. Не проблема, но когда мне тогда нужно что-то сделать с результатом задачи, я не совсем уверен, что это лучший способ сделать это.
Все примеры, которые я видел, используют либо Wait() для задачи, пока не завершатся, либо не ссылаются на параметр результата в задаче. Оба из них заблокируют поток, который запустил Task, чего я не хочу.
Некоторые решения, о которых я подумал:
-
Создайте новый поток и запустите задачу, затем используйте Wait() или .Result, чтобы заблокировать новый поток и как-то синхронизировать результат с вызывающим, возможно, с опросом в заданиях параметра IsCompleted.
-
Задайте задачу "Уведомлять завершенную", которую я могу запустить после завершения задачи, которую я хочу запустить, а затем вызывает статическое событие или что-то еще.
-
Передайте делегат во входную часть задачи и вызовите это, чтобы уведомить, что задача завершена.
Я могу думать или плюсы и минусы для всех из них, но мне особенно не нравится идея явно создать новый поток, чтобы запустить задачу, когда одна из целей использования класса Task в первое место - абстрагироваться от прямого использования Thread.
Любые мысли о лучшем способе? Я что-то пропустил? Будет ли событие "Завершено" слишком много, чтобы просить:)? (Конечно, есть веская причина, почему нет никого!)