Я хочу запустить задачу очистки, которая может работать в течение нескольких секунд. Несколько потоков могут вызвать эту задачу, но я хочу запустить эту задачу только один раз. Все остальные вызовы должны просто пропустить.Как избежать одновременного вызова метода без блокировки?
Ниже приведена моя текущая реализация, но я не могу себе представить, что нет лучшего решения в структуре .net, что приводит к меньшему количеству строк кода.
object taskLock;
bool isRunning;
void Task()
{
if (isRunning) return;
try
{
lock (taskLock)
{
if (isRunning) return;
isRunning = true;
}
// Perform the magic
}
finally
{
isRunning = false;
}
}
вы могли бы использовать подобный подход, но использовать параллельный словарь вместо объекта taskLock. tbh -if в настоящее время работает, перемещается и разбивает другие элементы в вашем отставании –
«Я не могу представить, что лучшего решения нет». Это неортодоксальная проблема, поскольку по определению она управляется с неоднозначными параллелизмами. В зависимости от синхронизации задача может быть запущена только один раз - или для каждого вызывающего потока. По крайней мере, это неэффективно. – Dummy00001
Да, это может быть очень неэффективно, но я не вижу лучшей альтернативы сигналу для выполнения определенной задачи. Альтернативой может быть использование события сброса, когда задача просто ждет, пока другой поток не установит это событие, но я должен управлять потоком/задачей. –