2010-12-22 8 views
2

System.Windows.Threading 네임 스페이스의 Distpatcher가 마음에 들면이 개체를 클래스 라이브러리에서 사용하고 싶습니다. 그러나 WPF 용으로 만들어 졌기 때문에 UI에 특정적인 것처럼 보입니다. 클래스 라이브러리에서 의도 한 목적을 악용하는 것 같습니다.스레드에서 작업 대기열 만들기

동일한 목적 (스레드에 대한 작업 항목 대기열 생성)을 제공하지만 클래스 라이브러리에서 사용하는 것이 더 나은 다른 클래스가 있는지 궁금합니다. 본질적으로 내가하고 싶은 것은 스레드를 만들고, 다른 스레드에서 비동기 적으로 많은 대리자를 큐에 넣고 실행시키는 것입니다.

나는 아주 쉽게 뭔가를 만들 수 있지만, 표준적인 규칙을 따르고 이미 입증 된 것을 사용하는 것을 선호합니다. 미리 감사드립니다.

답변

1

BlockingCollection 정확히 무엇입니까? Take 메서드는 큐에 항목이 나타날 때까지 실행을 차단하므로 이러한 유형의 생산자 - 소비자와 유사한 시나리오에 이상적입니다.

public class Worker 
{ 
    private BlockingCollection<Action> m_Queue = new BlockingCollection<Action>(); 

    public Worker() 
    { 
    var thread = new Thread(
    () => 
     { 
     while (true) 
     { 
      Action action = m_Queue.Take(); 
      action(); 
     } 
     }); 
    thread.IsBackground = true; 
    thread.Start(); 
    } 

    public void QueueWorkItem(Action action) 
    { 
    m_Queue.Add(action); 
    } 
} 
+0

이 솔루션의 단순함을 좋아합니다. 다른 API를 배울 필요가 없으며 즉각적인 필요를 해결합니다. 그러나 Tim Barrass의 솔루션에서 TPL의 작업 기능은 내가 결국 배울 필요가있는 것입니다. – Verax

1

TPL에는 작업 대기열을 처리하도록 인스턴스화 할 수있는 작업 스케줄러가 있습니다. this msdn link을 확인하십시오. 기본값은 그냥과에 작업을 추가 할 수 있어야 글로벌 ThreadPool이를 사용하는 것입니다 : 당신이보다 정교한 대기열 관리는 당신이 당신의 자신의 taskscheduler을 구현할 수 있습니다 원하는 경우

Task myTask = Task.Factory.StartNew(() => 
{     
    Console.WriteLine("Hello, I'm a queued task."); 
}); 

- 비아 많은 예들이있다 위 msdn 링크.