2013-07-04 2 views
0

Есть ли способ воспользоваться преимуществами неблокирующей синхронизации потоков, например описанной here, но при использовании объектов System.Threading.Task в текущих версиях каркаса .Net?Неблокирующая синхронизация с использованием System.Threading.Task

Что я ищу в основном меняется этот код

new Task(() => 
{ 
    lock (_lock) 
    { 
     ...    
    } 
}); 

в то, что не будет блокировать Threadpool нить, которая будет использоваться в Task при выполнении операции под защитой замка.

+1

Допустимо блокировать выполнение задач, если критическая часть недолговечна, и вы избегаете рисков взаимоблокировок. – Douglas

+0

Также не используйте конструктор 'Task' явно. Вместо этого используйте 'Task.Factory.StartNew'. – Douglas

+0

Тем не менее, если вы действительно нацелены на неблокирующую реализацию, способ пойти на разложение вашего алгоритма в ряд задач и продолжений. – Douglas

ответ

2

Если вы хотите сделать это с помощью .Net 4.0 TPL, вы можете использовать пользовательский TaskScheduler, например LimitedConcurrencyLevelTaskScheduler from ParallelExtensionsExtras.

Если вы можете использовать C# 5.0, вы можете использовать await вместе с SemaphoreSlim.WaitAsync() или AsyncLock from Nito AsyncEx.

+1

.NET 4.5 представил 'ConcurrentExclusiveSchedulerPair', который включает ограниченный параллелизм. –

+0

Ницца, мне кажется, мне нравится идея «AsyncLock», я постараюсь поиграть с ней и посмотреть, насколько я могу добиться того, что мне нужно. Окружающая среда, над которой я работаю, - это C# 5.0, .NET Framework 4.5, переносимый проект библиотеки классов. –

Смежные вопросы