У меня есть приложение с несколькими 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;
}