2012-05-14 4 views
1

멀티 스레드 접근 방식을 사용하여 동시에 여러 전자 메일을 보내려고합니다. 여기 내 설명 :다른 사람이 무작위로 도착하는 동안 일부 전자 메일이 도착하도록 보장

내가 5 이메일을 무작위로 보낼 필요가 :

Email1 
Email2 
Email3 
Email4 
Email5 

어쩌면 Email5가 먼저 이메일 1 또는 Email4를 전송됩니다.

고객의 새로운 요구 사항이 있습니다. 이메일 1,2,3이 무작위로 전송 될 수 있지만 이메일 5는 이메일 5보다 먼저 보내야합니다 (사용자는 이메일 5를 받기 전에 이메일 4를받습니다. 일부 이메일은 주문과 임의로 보내야 함) .

멀티 스레딩 접근법을 사용하여이 문제를 어떻게 처리해야할지 모르겠다.

+0

Email5가 Email4 다음으로 나오거나 Email5가 Email4 이후에 언제든지 도착할 수 있다는 것을 의미합니까? –

+1

이메일을 보내는 순서가 동일한 배달 순서를 보장하지 않습니다. 대부분의 전자 메일은 송수신 메일 서버에서 일괄 전송되며 많은 전자 메일 클라이언트는 보낸 날짜가 아닌 배달 날짜별로 정렬됩니다. 나는 이것이 당신의 질문에 대답하지 않는다는 것을 알기 때문에, 나는 코멘트로 글을 게시하지만, 당신이 명심해야 할 것이있다. – Chris

+0

@ p.campbell : 예, Email5는 Email4 이후의 다음 문자 여야합니다. –

답변

0

우선 순위를 지정 하시겠습니까? 하지만 실제로 메일 서버에 여러 연결을 유지하지 않으면 메일이 순서대로 전송됩니다 ...

0

각 이메일에 세마포를 연결하고 이메일 스레드를 가질 수 있습니다. 5 이메일 세마포어를 받고 대기합니다. 4 이메일을 보내기 전에 각 세마포어는 제로 허가로 초기화되어야하며 스레드는 이메일을 보낼 때 하나의 허가를 해제해야합니다. 뮤텍스를 사용하여이 작업을 수행 할 수도 있습니다.

+0

이것은 숙제 인 것으로 알고있는 경우에만 유용합니다. 세마포어를 사용할 것으로 예상됩니다. 그렇지 않으면이 접근법은 확장되지 않습니다. –

2

당신이 작업 병렬 라이브러리를 사용하는 경우 요구 사항이 종류의 TPL 함께 순차적으로 전송해야합니다 이메일을 체인에 LinkedList를 사용할 수 있습니다 사용하지 ContinueWith

var firstTask = new Task(() => SendEmail(4)); 
    var secondTask = firstTask.ContinueWith((t) => SendEmail(5)); 
    firstTask.Start(); 

다른 방법을 사용하여 충족하기 쉽습니다. Queue<LinkedList<Email>>을 만듭니다. 작업자 스레드는 Queue 항목을 사용하여 LinkedList을 선택한 다음 연결하여 각각 을 전송합니다.

+0

고맙습니다.하지만 .net 2.0에서 어떻게 같은 방법으로 할 수 있습니까? –

0

작업자 패턴을 사용하는 경우 작업 대기열을 순차 화 및 비 순차 화 (두 개의 작업 대기열)로 분할하고 하나의 스레드에서만 시퀀스 대기열을 처리하게하십시오.

관련 문제