2014-05-21 4 views
1

외부 공급 업체 DLL 양식을 사용하고 있습니다. 이 DLL은 스레드로부터 안전하지 않습니다. 실제로 다른 스레드에서 해당 메서드를 호출하려고하면 오류 메시지 상자가 표시되어 중지됩니다. 그리고 DLL에 액세스하는 더 많은 스레드를 사용하는 더 큰 프레임 워크에서 DLL을 사용하고 있습니다. 스레드가 동시에 활성화되지 않아 경쟁 조건이 발생하지 않습니다.스레드 공급 업체가 아닌 외부 공급 업체의 DLL을 사용하십시오.

질문은 다음과 같습니다. 이것을 극복하는 간단한 방법은 무엇입니까? ManualResetEvent, waitOne 및 이벤트를 사용하여 절대로 중단하지 않는 하나의 특별한 스레드에서 실행되는 래퍼를 만들기 시작했습니다. 그러나 이벤트를 통해가는 것은 그 속임수를하지 않습니다. 어떻게하면 DLL이 하나의 스레드에서만 사용된다고 생각하게 할 수 있습니까?

+0

dll에 대한 모든 호출을 '잠금'하는 래퍼를 만들 수 있습니다. http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx – Vlad

+0

대부분의 코드가 스레드에 안전하지 않은 것은 사실입니다. 프레임 워크의 거의 모든 유형이 있습니다. 당신이 잘못하고 있다고 말하는 벤더에게 그 시가를 사주세요. 그는 분명히 당신보다 더 나은 조언을 줄 수 있습니다. 전화를 받고 전화를 겁니다. –

답변

0

dll에 대한 래퍼 클래스를 코딩하는 것이 좋습니다.

.net 4 이상을 사용하는 경우 특수 작업 스케줄러를 살펴볼 수 있습니다. 특별히이 하나 : http://blogs.msdn.com/b/pfxteam/archive/2010/04/07/9990421.aspx

TPL이없는 경우에도 동일한 원칙을 적용 할 수 있습니다. 그것은 조금 더 많은 일이 될 것입니다.

StaTaskScheduler에서 예약 된 작업을 통해이 DLL의 각 기능을 호출하십시오.

귀하의 DLL 호출이 괜찮을 것)

편집 :

public class NotThreadSafeClass 
{ 
    public int SomeMethod(string x, int y) 
    { 
     return 3; 
    } 
} 

public class ThreadSafeWrapper 
{ 
    private TaskScheduler sta = new StaTaskScheduler(numberOfThreads: 1); 
    private NotThreadSafeClass old = new NotThreadSafeClass(); 
    public Task<int> SomeMethod(string x, int y) 
    { 
     return Task<int>.Factory.StartNew(() => old.SomeMethod(x,y), 
      CancellationToken.None, TaskCreationOptions.None, sta); 
    } 
} 

나는 경우 래퍼의 대기 외부를 유지하는 것입니다 : 내가 생각

코드는 다음과 같이해야한다는 것입니다 4 세 이상입니다. 또한 클래스는 여러 스레드가 여러 스레드를 액세스하게하는 다중 생성을 방지하기 위해 단일 스레드 여야합니다.

+0

답장을 보내 주셔서 감사합니다. @Hylaean! 나는 .net 4를 사용하고 작업 스케줄러 링크를 조사하기 시작했습니다 ... 누군가에게 예제가 있으면 바랍니다. – user3661345

+0

@Hylaean 다시 한번 감사드립니다. 그것은 일하고있다! wrapper metode가 notThreadSafe가 int를 반환 할 때 작업을 반환한다는 것을 다소 혼란스러워하지만, 이제는 변경되고 행복합니다. 감사합니다 – user3661345

+0

당신이 그것을 원한다면 당신은 환영합니다, 당신은 대답을 수락 할 수 있습니다;) – Hylaean

관련 문제