У меня есть приложение с несколькими Dispatcher
(иначе говоря, потоки графического интерфейса, так называемые сообщения), чтобы гарантировать, что медленная, невосприимчивая часть GUI работает, не слишком сильно влияя на остальную часть приложения. Я также часто использую Task
.
В настоящее время у меня есть код, который условно запускает Action
на TaskScheduler
или Dispatcher
, а затем возвращает Task
либо напрямую, либо вручную создавая с помощью TaskCompletionSource
. Однако этот раздельный дизайн личности делает дело с отменой, исключениями и т.д. Все намного сложнее, чем хотелось бы. Я хочу использовать Task
всюду и DispatcherOperation
нигде. Для этого мне нужно запланировать задачи диспетчеров, но как?
Как я могу получить TaskScheduler
для любого заданного Dispatcher
?
Изменить:. После обсуждения ниже я остановился на следующей реализации:
public static Task<TaskScheduler> GetScheduler(Dispatcher d) {
var schedulerResult = new TaskCompletionSource<TaskScheduler>();
d.BeginInvoke(() =>
schedulerResult.SetResult(
TaskScheduler.FromCurrentSynchronizationContext()));
return schedulerResult.Task;
}