До сих пор я пытался использовать 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());
}
}
Любые советы очень ценятся.
Изменить: оба метода Start() и Stop() должны вызываться в очень определенные моменты во время выполнения.>
Подробнее здесь: https://stackoverflow.com/questions/798 ... -execution
Мобильная версия