2011-07-04 6 views
2

.NET에서 라이브러리와 통신해야하는 멀티 스레드 환경이 있습니다. 라이브러리에는 몇 가지 제한 사항이 있으므로 다중 스레드 환경에서 제대로 작동하지 않습니다. 중간 스레드를 사용하여 멀티 스레드 환경과 통신 한 다음 라이브러리를 호출하여이 문제를 해결할 방법이 필요합니다. 나는 그 문제를 해결 한 해결책을 만들었지 만, 그것이 최선이라는 것을 확신하지 못했습니다. run 메서드가있는 비동기 스레드를 만들었습니다. run 메서드는 현재 작업 (설정 한 매개 변수)이 무엇인지 확인하고 해당 메서드를 실행하는 무한 루프에 있습니다.여러 스레드 동기화

내가 말했듯이, 나는이 해결책으로는 전혀 확신하지 못하고 올바르게 작동합니다. 그래서 그것을 해결할 더 나은 사람이 있다면 알려주십시오. (특히 C#과 관련된 경우).

부울 노트와 마찬가지로이 제한은 동시에 작동하고 데이터 손상을 일으키는 여러 스레드 때문이 아닙니다. 나는 모든 것을하기 위해 똑같은 스레드가 필요하다 (스레드 ID에 의존한다).

+3

귀하의 접근 방식은 잘 들린다. 보류중인 작업이 없으면 무한 루프가있는 스레드가 잠자기 상태 여야합니다. 당신의 구현은 그렇게합니까? 그렇지 않은 경우 일부 코드를 게시하면 도움이됩니다. – dtb

+2

아마도 [BlockingCollection ] (http://msdn.microsoft.com/en-us/library/dd267312.aspx)을 사용하여 [ConcurrentQueue ] (http://msdn.microsoft.com /en-us/library/dd267265.aspx). – dtb

+0

동일한 스레드에서 모든 작업을 예약하는 사용자 지정 [TaskScheduler] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.aspx)를 구현할 수도 있습니다. – dtb

답변

2

Task Parallel Library을 살펴보십시오.

동일한 스레드에서 모든 작업을 예약하는 사용자 지정 TaskScheduler을 구현하는 것이 좋습니다. 스케줄러를 사용하여 Task (결과 값 없음) 또는 Task<T> (유형 T 결과)을 스케줄 할 수 있습니다.

ConcurrentQueue<Task>을 래핑하는 BlockingCollection<Task>을 사용하여 스케줄러를 구현할 수 있습니다.

public class CoffeeMachine 
{ 
    private readonly TaskScheduler scheduler; 

    public CoffeeMachine() 
    { 
     this.scheduler = new SingleThreadTaskScheduler(); 
    } 

    public Task<Coffee> MakeCoffeeAsync() 
    { 
     return Task.Factory.StartNew<Coffee>(
      this.MakeCoffee, 
      CancellationToken.None, 
      TaskCreationOptions.None, 
      this.scheduler); 
    } 

    private Coffee MakeCoffee() 
    { 
     // this method will always execute on the same thread 
    } 
} 
: 라이브러리 함수 MakeCoffee를 노출 가정 예를 들어

, 당신은 일치하는 래퍼 방법 및 일정 사용자 지정 스케줄러 라이브러리를 호출하는 작업을 제공하는 클래스 에서 CoffeeMachine를 만들 수 있습니다

사용법 :

CoffeeMachine machine = new CoffeeMachine(); 

Task<Coffee> task = machine.MakeCoffeeAsync(); // start task 

task.Wait();          // wait for task to complete 
Drink(task.Result);        // use result 
+0

대단히 감사합니다 @ dtb – Sami