2012-10-24 3 views
0

이 방법을 멀티 스레드하는 방법이 있습니까? 내가 볼 수있는 문제는 유일한 공유 상태가 메소드 시간의 약 절반을 차지하는 이미지 소스의 복제라는 것입니다. 목록에 약 5 ~ 10,000 명의 수신자가 있습니다.작업 멀티 스레딩

하나의 작업에 복제본과 다른 TryDequeue를 추가하고 처리하는 ConcurrentQueue를 시도했지만 500 개가 넘는 항목은 7 초만 저장됩니다. imgSrc를 다시 롤백하거나 변경 사항을 실행 취소하여 새 복제본을 만들지 않아도되는 방법이 있습니까?

public static void CreateImages(string fileSrc, string pathDestination, IEnumerable<Recipient> recipients) 
    { 
     var sfCenter = new StringFormat(); 
     sfCenter.Alignment = StringAlignment.Center; 
     sfCenter.LineAlignment = StringAlignment.Center; 

     using (var imgSrc = new System.Drawing.Bitmap(fileSrc)) 
     { 
      foreach (var rec in recipients) 
      { 
       using (var imgCopy = imgSrc.Clone() as Bitmap) 
       using (var graphicImage = Graphics.FromImage(imgCopy)) 
       { 
        graphicImage.SmoothingMode = SmoothingMode.AntiAlias; 
        graphicImage.DrawString(rec.Name, new Font("Arial", 16, FontStyle.Bold), Brushes.Black, new Rectangle(170, 105, 650, 50), sfCenter); 
        // plus other activity 
        var fileOut = pathDestination + rec.ID + ".jpg"; 
        imgCopy.Save(fileOut, ImageFormat.Jpeg); 
       } 
      } 
     } 
    } 
+1

이 코드가 CPU 바운드입니까? 디스크 입출력이 병목 현상이 될 것으로 예상하고, 더 많은 스레드를 추가하면이 경우 성능이 저하 될 수 있습니다. – rene

+0

복사본을 디스크에 저장하는 것이 필수적입니까? .net 4.5로 업그레이드 할 수 있다면 자신 만의 스레드를 만드는 것보다 효율적인 I/O 완료 포트를 사용하는 async를 사용할 수 있습니다. 그렇지 않다면, F #은 상응하는 방식으로 작동하는 비동기 계산 표현식을가집니다. – Christian

+0

디스크 바인딩 됨. 추가 스톱워치 확인은 복제본을 표시하고 그래픽 섹션은 저장 기간만큼 소요됩니다. 디스크에 저장; 예. .Net 4.5; 불행하게도 여전히 XP 중 하나가 실행됩니다. 방금이 간단한 알고리즘을 확장하는 방법을 알지 못하는 것은 저에게 맞다고 생각했습니다. – Cheval

답변

0

더 좋은 방법은 없습니다. 그것이 얻는만큼 좋게 보인다.