Я пишу приложение, в котором я использую несколько методов доступа к некоторым общим ресурсам, поэтому реализовал некоторую безопасность с помощью lock(thisLock){ [...] ]
Все было хорошо, пока мне не пришлось использовать ресурсы внутри асинхронной задачи.Это код:
private object thisLock = new object();
[...]
private void UpdateStuff()
{
lock(thisLock)
{
Task.Run(()=>{[code where I use shared resources]});
}
}
Кажется, он работает нормально, но мне было интересно, если это правильный способ, или я должен поместить часть lock()
внутри Run (), какэто:
private void UpdateStuff()
{
Task.Run( () => {
lock(thisLock)
{
[code where I use shared resources]
}
});
}
Я пытался получить некоторую информацию, но все, что я нашел, упоминает случай, когда используется ключевое слово async
, а это не так.
Итакмой вопрос: какой из них является лучшим / правильным способом использовать lock () с Task.Run ()?Зачем?
Спасибо!
РЕДАКТИРОВАТЬ: Чтобы уточнить, я сомневаюсь, когда и насколько эффективна блокировка, поэтому в основном я спрашиваю, есть ли в первом случае возможность, когдаблокировка действительна только для вызова Run()
, поскольку содержимое самого вызова может находиться в другом потоке, в то время как во втором случае блокировка будет связана с содержимым и, таким образом, будет действовать.