У меня есть программный механизм, который я не могу изменить:
У меня есть struct
для контекстов.
Я использую указатель контекстов, а не struct
сам объект, потому что Я должен передать этот контекст неуправляемому коду, и неуправляемый код примет только указатель в качестве параметра , чтобы потом вернуть его мне при обратном вызове.
IМне нужно использовать любые ограничительные методы для конкретной функции в отношении контекстов, чтобы ее можно было вызывать только один раз одновременно.
Поэтому я бы использовал SemaphoreSlim
, или, если я не могу это использовать, то явсе еще будет использовать ManualResetEvent
или AutoResetEvent
в качестве обходного пути, технически заблокировать вызов функции контекста, пока неуправляемый код не вызовет обратный вызов, поэтому я могу снять блокировку.
Поскольку мне нужно передать указатель нанеуправляемый код, который я преобразую в свой контекст struct
в Context*
с помощью , закрепление с помощью GCHandle.Alloc()
, затем получение указателя с помощью GCHandle.AddrOfPinnedObject()
.
Проблема в моем контексте1026 * SemaphoreSlim
или Manual/AutoResetEvent
утраanaged type, который делает меня неспособным получить их, или событие указателя контекста.
Есть ли какое-либо решение закрепить эти управляемые объекты и получить их указатели, а затем привести их обратно к объекту?
Например:
SemaphoreSlim ss1 = new SemaphoreSlim(0);
SemaphoreSlim* pointerOfSemaphore = &ss1;
SemaphoreSlim ss2 = *pointerOfSemaphore;
ss2.Release();
Я знаю, потому что это не тип значения. Таким способом невозможно получить его адрес, но есть ли другое решение?
Или, какальтернативное решение: я могу использовать Manual/AutoResetEvent
и получить их дескрипторы как IntPtr
, но я не знаю, как выпустить их WaitOne()
событие (сигнализирующее Set()
) только при наличии Handle
.
Любые идеи будут оценены по достоинству!