LongRunning
- это просто намек на TaskScheduler
.В случае SynchronizationContextTaskScheduler
(как возвращено TaskScheduler.FromCurrentSynchronizationContext()
) он, очевидно, игнорирует подсказку.
С одной стороны, это кажется нелогичным.В конце концов, если задача долго выполняется, вряд ли вы захотите, чтобы она выполнялась в потоке пользовательского интерфейса.С другой стороны, в соответствии с MSDN:
LongRunning - Указывает, что задача будет длительной, крупнозернистой операцией.Он дает подсказку TaskScheduler, что превышение подписки может быть оправдано.
Поскольку поток пользовательского интерфейса не является потоком пула потоков, не может возникнуть «избыточная подписка» (истощение пула потоков), такощущение, что подсказка не будет иметь никакого эффекта для SynchronizationContextTaskScheduler
.
Несмотря на это, вы можете обойти эту проблему, переключившись обратно в планировщик задач по умолчанию:
void ShortUIWork()
{
Debug.Assert(this.Dispatcher.CheckAccess() == true);
Task.Factory.StartNew(LongWork, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}