비슷한 문제가 있었으므로 내 솔루션이 도움이되기를 바랍니다.
기본적으로 ReaderWriterLockSlim에는 스레드 선호도가 있습니다. 즉, 잠금을 획득 한 스레드 만이를 릴리스 할 수 있습니다.
이 솔루션은 전용 스레드를 하나 더 만들지 만 사용자가 제안한 것에 반대되는이 스레드는 잠금을 획득하고 해제하는 데에만 사용됩니다. 과 같이 표시됩니다 문제를 해결
public class ClassUsingReaderWriterLockSlim
{
private ReaderWriterLockSlim rwsLock;
public void MethodThatAcquiresLock()
{
rwsLock.EnterWriteLock();
}
public void MethodThatReleasesLock()
{
rwsLock.ExitWriteLock();
}
}
그리고 코드 :
나는 당신의 코드는 다음과 같이 보입니다 추측
public class ClassUsingReaderWriterLockSlim
{
private ReaderWriterLockSlim rwsLock;
Thread dedicatedThreadForReaderWriterLockSlim;
Queue<string> commandsForDedicatedThread;
public ClassUsingReaderWriterLockSlim()
{
commandsForDedicatedThread = new Queue<string>();
dedicatedThreadForReaderWriterLockSlim = new Thread(ThreadFunction);
dedicatedThreadForReaderWriterLockSlim.Start();
}
private void ThreadFunction(object obj)
{
while (!terminatingCondition)
{
// Wait until something is in queue...
if (commandsForDedicatedThread.Count > 0)
{
switch (commandsForDedicatedThread.Dequeue())
{
case "ENTER LOCK":
rwsLock.EnterWriteLock();
case "EXIT LOCK":
rwsLock.EnterWriteLock();
default:
// Do nothing...
}
}
}
}
public void MethodThatAcquiresLock()
{
commandsForDedicatedThread.Enqueue("ENTER LOCK");
}
public void MethodThatReleasesLock()
{
commandsForDedicatedThread.Enqueue("EXIT LOCK");
}
}
음, 생산 코드를 당신이 만드는 것이 조금 다르게하지만 기본 아이디어는 잠금 및 잠금 해제를 수행하는 전용 스레드를 갖는 것입니다.이 방법으로 스레드 호출이 코드/자원을 잠그고 잠금 해제해야하는 메소드로 오는 것은 중요하지 않습니다. ..
희망이 도움이됩니다.
WPF 또는 Windows.Forms를 사용하고 있습니까? 또는 ASP.Net? 그게 크게 대답에 영향을 미칠 것입니다 :) – gnud
재미있는 - 글쎄, ReaderWriterLockSlim을 포함하는 기본 라이브러리는 여러 애플 리케이션에서 사용됩니다; 일부는 Windows Forms에서, 다른 일부는 WPF에서; 문제가되는 경우는 WPF 앱에서 사용할 때입니다. – Smashery
WPF에서 생성 된 일반 작업은 동일한 스레드 인 Dispatcher 스레드에서 모두 실행되어야합니다. 그러나 '장기 실행'작업은 물론 스레드 풀에서 명시 적으로 생성 된 작업의 경우가 아닙니다. https://msdn.microsoft.com/magazine/gg598924.aspx – gnud