Apr 04, 2014 16:15
// C#, .NET Framework 4.0 (or 4.5, with the same result)
private void ExecuteOnWorkerThread(Action action)
{
Task.Factory.StartNew(()=>action, CancellationToken.None, TaskCreationOptions.PreferFairness, TaskScheduler.Default);
}
Leave a comment
Comments 5
Reply
Reply
Reply
Reply
Первый WTF как раз и заключается в том, что код на первый взгляд выглядит нормально, только вот не работает, зараза. Не вызывается action() и все, хоть ты тресни. Автор сих строк, и еще парочка вроде как специалистов смотрели на этот код минут 40, пока поняли в чем дело. Дошло до скачивания исходников Task library и написания примитивной реализации Task Scheduler'а.
А проблема заключается всего лишь в четырех "птичьих" символах ()=>, которые глаз просто пропускает "мимо ушей".
// не работает
Task.Factory.StartNew(()=>action, CancellationToken.None, ...);
// работает
Task.Factory.StartNew(action, CancellationToken.None, ...);
WTF второго уровня: зачем этот метод вообще нужен, если она передаёт в StartNew() одни значения по умолчанию? А вот зачем: TaskScheduler.Default не всегда является scheduler'ом по умолчанию (оп-па).
Если мы вызываем Task.Factory.StartNew() "с нуля", то оно запустит задачу через TaskScheduler по умолчанию. Но если же мы вызываем StartNew ( ... )
Reply
Leave a comment