2016-12-05 3 views
3

ReaderWriterLockSlim을 사용하는 코드가 있습니다. 특정 객체가 생성 될 때 쓰기 잠금을 획득하고 잠시 후에 해당 객체가 삭제 될 때 해제합니다. 그러나 이러한 호출이 어디에서 발생했는지, 나는 그들이 ReaderWriterLockSlim의 요구 사항 인 동일한 스레드에 있다는 것을 보장 할 수 없습니다.TaskScheduler가 항상 동일한 스레드에서 실행됩니다.

합리적인 해결책은 전용 스레드에서 개체의 생성 및 처리를 실행하고 호출 코드가 해당 작업이 완료 될 때까지 기다릴 수 있다고 생각하지만 스레드를 계속 유지하는 것입니다. 지저분 해 보이지만 코드를 대규모로 재구성하지 않으면 다른 접근법을 생각할 수 없습니다.

동일한 스레드에서 두 개의 작업을 실행할 수있는 기존 TaskScheduler 하위 클래스가 있습니까?

물론이 작업을 수행하는 또 다른 패러다임이 열려 있습니다.

+2

WPF 또는 Windows.Forms를 사용하고 있습니까? 또는 ASP.Net? 그게 크게 대답에 영향을 미칠 것입니다 :) – gnud

+0

재미있는 - 글쎄, ReaderWriterLockSlim을 포함하는 기본 라이브러리는 여러 애플 리케이션에서 사용됩니다; 일부는 Windows Forms에서, 다른 일부는 WPF에서; 문제가되는 경우는 WPF 앱에서 사용할 때입니다. – Smashery

+0

WPF에서 생성 된 일반 작업은 동일한 스레드 인 Dispatcher 스레드에서 모두 실행되어야합니다. 그러나 '장기 실행'작업은 물론 스레드 풀에서 명시 적으로 생성 된 작업의 경우가 아닙니다. https://msdn.microsoft.com/magazine/gg598924.aspx – gnud

답변

0

비슷한 문제가 있었으므로 내 솔루션이 도움이되기를 바랍니다.

기본적으로 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"); 
    } 
} 

음, 생산 코드를 당신이 만드는 것이 조금 다르게하지만 기본 아이디어는 잠금 및 잠금 해제를 수행하는 전용 스레드를 갖는 것입니다.이 방법으로 스레드 호출이 코드/자원을 잠그고 잠금 해제해야하는 메소드로 오는 것은 중요하지 않습니다. ..

희망이 도움이됩니다.