Don't lambda the lambda unless the lambda lambdas you

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

harmala April 5 2014, 08:10:40 UTC
А в чём тут проблема?

Reply

trailmax April 5 2014, 10:36:18 UTC
action не запустится, там лямбда не нужна

Reply


dil April 5 2014, 08:37:43 UTC
А в чём WTF? Нормальная обёртка для системной функции с дефолтовыми значениями..

Reply

trailmax April 5 2014, 10:36:30 UTC
Wtf нет, но action не запустится, там лямбда не нужна

Reply


yatur April 5 2014, 23:42:45 UTC
Отвечаю на вопрос, в чем тут WTF. WTF тут, на мой взгляд двухуровневый.

Первый 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

Up