Предположим, есть две задачи:
Task.Run(() => {
while (!this.isCanceled)
DoOperation(obj);
});
а также
Task.Run(() => {
foreach(var obj in objects) // Another objects' subset
while(!this.isCancelled)
DoOperation(obj);
});
И DoOperation(Foo obj)
реализация:
DoOperation(Foo obj)
{
if (obj.IsBar && obj.IsFoo)
obj.MakeSad();
else
obj.MakeHappy();
}
Мы можем заблокировать метод DoOperation
, и все должно быть хорошо, но у этого подхода есть некоторые недостатки производительности. Более того, с помощью метода DoOperation
можно работать с большим количеством задач одновременно. Второй подход заключается в дублировании всего метода в каждой задаче. Но это еще хуже.
Итак, вопрос в том, как избежать блокировки и предотвратить дублирование кода?