2011-04-08 6 views
3

필자는 작업자 또는 대기열 (아마도 새로운 ConcurrentQueue)에 위임을 삽입하는 메서드를 원하는 일부 액터 모델 유형의 메시지 처리 시나리오를 사용하고 있습니다. 대기열을 처리하고, 작업을 실행 한 다음 결과를 반환하는 다른 프로세스 (가능하면 잠금없이). 이 메소드는 동 기적으로 또는 비동기 적으로 호출 될 수 있습니다. 하나의 행동은 내가 다소 성능이 좋은 방법으로이 작업을 수행하는 방법에 주위에 내 머리를 정리 할 수 ​​ 대기열을 사용하는 비동기식/동기식 동시 호출

는, 사람이 시도 보는 것 :

편집 여기

에게 도움을 주시기 바랍니다

동시에 실행할 수있는 대기 이 접근법에 대한 문제 (예외 처리 제외)? 또한, 단순히 잠금에 비해 많은 오버 헤드가 발생하고 비동기 대리자를 사용하는 경우와 어떻게 비교할 수 있을까요?

public partial class Form1 : Form 
    { 
    private BlockingCollection<Task<int>> blockingCollection = new BlockingCollection<Task<int>>(new ConcurrentQueue<Task<int>>()); 
    private int i = 0; 
    public Form1() { 
     InitializeComponent(); 

     Task.Factory.StartNew(() => 
     { 
      foreach (var task in blockingCollection.GetConsumingEnumerable()) { 
      task.Start(); 
      task.Wait();   
      } 
     }); 
    } 


    public int Queue() { 
     var task = new Task<int>(new Func<int>(DoSomething)); 
     this.blockingCollection.Add(task); 
     task.Wait(); 
     return task.Result; 
    } 

    public int DoSomething() { 
     return Interlocked.Increment(ref this.i); 
    } 

    private void button1_Click(object sender, EventArgs e) { 
     Task.Factory.StartNew(() => Console.Write(this.Queue())); 
    } 


    } 
+0

프레임 워크의 TPL Task 병렬 라이브러리와 요구 사항 간의 차이점은 무엇입니까? 대기열은 프레임 워크만으로 처리되며 요구 사항에 따라 다른 동기화 대안이 있습니다. – weismat

+0

SmartThreadPool 라이브러리 (http://smartthreadpool.codeplex.com/)를보고 싶을 수도 있습니다. – Larry

답변

0

TPL이해야 할 당신을 위해 - 단지에 Wait()를 호출하여 Task<T> - 그러나, 블록하지 않고이 작업을 수행 할 수있는 방법이 없다; 정의에 의해, 정확히 당신이하고 싶은 시나리오에서. 차단 일 수 있으며 lock을 통해 구현 될 수 있지만 다른 방법이 있습니다. TPL이이를 숨 깁니다. 개인적으로 비슷한 시나리오에서 사용자 지정 큐와 내가 잠글 수있는 개체의 미니 풀 (래퍼 외부에 노출되지 않음)을 사용하여 작업을 수행합니다.

C# 5 비동기/대기중인 항목을 살펴볼 수도 있습니다.

참고 : 기다리는 동안 아무런 도움이되지 않으면 해당 코드가 현재 스레드에서 직접 실행될 수도 있습니다. 문제가 스레드 바운드 인 경우 (예 : 멀티플렉서)는 예외입니다. 관심이 있다면, 나중에 (또는 주말) 오늘 stackoverflow가 redis와 대화하기 위해 사용하는 멀티플렉서를 발표 할 생각입니다. (적어도 동기 모드에서는) 여러분이 설명하는 문제가 있습니다.

부수적으로; 콜백 (다른 스레드에서)으로 작업 할 수 있고 완료시 을 기다릴 필요가 없으면 전체적으로보다 효율적일 수 있습니다. 완료시을 기다려야합니다. 그러나 모든 시나리오에 맞지는 않습니다.

관련 문제