C# – блокировка нескольких методов или всего класса для выполнения в одном потокеC#

Место общения программистов C#
Ответить
Anonymous
 C# – блокировка нескольких методов или всего класса для выполнения в одном потоке

Сообщение Anonymous »

Я пытаюсь гарантировать, что методы в моем классе могут вызываться только одним потоком.
До сих пор я пытался использовать ReaderWriterLockSlim для достижения этого эффекта, но это может вызвать потенциальные проблемы, если он не будет правильно выпущен вызывающим кодом. Проблема выделена в коде.
Упрощенный пример, дающий представление о проблеме.

Код: Выделить всё

public class Result
{
//some code here
}
public static class Executor
{
// here Start and Stop have to be called in sequence by the same thread.
private static readonly ReaderWriterLockSlim _lock = new();

public static void Start() {
_lock.EnterWriteLock();
try
{
// some code here
// sets some internal variables and calls internal methods
}
catch (Exception)
{
_lock.ExitWriteLock();
throw;
}
}

public static Result Stop() {
try
{
// some code here
// sets some internal variables and calls internal methods

}
finally
{
_lock.ExitWriteLock();
}
}
}

// example caller
// calling class implementation is done by external user who does not know about Executor limitations

public static class Caller
{
public static void Run(){

// prepare parameters for Start()

// it is important that only one thread can be used between Start() and Stop()
Executor.Start();

// code to use while Start() is running.

// ISSUE: if code exits for any reason without calling Executor.Stop() it will never release lock.

var result = Executor.Stop();

// code to use after Stop() with result variable.
}
}

// run multithreaded
class Program
{
static void Main(string[] args)
{
var tasks = new List();
tasks.Add(Task.Run(Caller.Run));
tasks.Add(Task.Run(Caller.Run));
tasks.Add(Task.Run(Caller.Run));
Task.WaitAll(tasks.ToArray());
}
}
В идеале хотелось бы привязать класс Executor к одному потоку, а не обязательно только к методам.
Любые советы очень ценятся.
Изменить: оба метода Start() и Stop() должны вызываться в очень определенные моменты во время выполнения.
Позвольте мне попытаться прояснить проблему дальше.
  • API требует вызова методов Start() и Stop() в очень определенных моментах во время выполнения. Код перед Start() подготовит некоторые параметры, затем после Start() код выполнит некоторые манипуляции и вызовет внутренние параметры и, наконец, Stop() вернет дескриптор объекта, который необходимо использовать позже.
  • Это не то, что можно изменить из-за сложной внутренней структуры кода.
  • Я думаю, что мое описание проблемы многопоточности недостаточно. Точнее, методы Start() и Stop() должны выполняться в одном потоке. Другими словами, если один поток вызывает Start(), то никакие другие потоки не могут его вызвать до тех пор, пока исходный поток не вызовет Stop().
  • Приведенный выше код с использованием ReaderWriterLockSlim решает эту проблему, но может вызвать блокировку потока, если по какой-то причине Stop() не была вызвана.


Подробнее здесь: https://stackoverflow.com/questions/798 ... -execution
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»