Как запустить задачу с определенным планировщиком (например, с графическим интерфейсом)

Я пытаюсь создать Task с TPL. например:

Task.Factory.StartNew(() => DoSomething());

Это отлично работает, но теперь я хочу запустить его в потоке графического интерфейса.

Я могу кэшировать планировщик графического интерфейса с помощью:

_uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

но я не вижу, как запустить новую задачу с помощью этого планировщика. Во всех примерах, которые я могу найти, используется Task.ContinueWith() для планирования второй задачи с помощью _uiScheduler после завершения начальной задачи, но я хочу создать начальную задачу с помощью этого планировщика.

Ваше здоровье


person GazTheDestroyer    schedule 13.12.2012    source источник


Ответы (3)


Существует огромное количество перегрузок StartNew. Один из них принимает планировщик. Просто передайте None для других параметров:

Task.Factory.StartNew(() => DoSomething(), CancellationToken.None,
                      TaskCreationOptions.None, _uiScheduler);
person Daniel Hilgarth    schedule 13.12.2012
comment
Д'ОХ! Я мог бы поклясться, что прошел через все перегрузки. Спасибо, парни. - person GazTheDestroyer; 13.12.2012

Простой — есть перегрузки (например, эта) TaskFactory.StartNew, в качестве одного из параметров которых используется планировщик.

Task.Factory.StartNew(() => DoSomething(), CancellationToken.None,
                      TaskCreationOptions.None, _uiScheduler);
person Jon Skeet    schedule 13.12.2012

Попробуй это:

TaskFactory factory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
factory.StartNew(() => DoSomething());
person Hamlet Hakobyan    schedule 13.12.2012