2013-04-02 3 views
0

Это первый раз, когда я пытаюсь несколько потоков в проекте, так что несите меня. Идея такова. У меня есть куча документов, которые мне нужно преобразовать в pdf. Я использую itextsharp для преобразования для меня. При запуске итеративно программа работает нормально, но медленно.Multi Threading and Task issue

У меня есть список предметов, которые необходимо преобразовать. Я беру этот список и разбиваю его на 2 списка.

   for (int i = 0; i < essaylist.Count/2; i++) 
       {       
        frontessay.Add(essaylist[i]); 
        try 
        { 
         backessay.Add(essaylist[essaylist.Count - i]); 
        } 
        catch(Exception e) 
        { 
        } 
       } 
       if (essaylist.Count > 1) 
       { 
        var essay1 = new Essay(); 
        Thread t1 = new Thread(() => essay1.StartThread(frontessay)); 
        Thread t2 = new Thread(() => essay1.StartThread(backessay)); 

        t1.Start(); 
        t2.Start(); 

        t1.Join(); 
        t2.Join(); 
       } 
       else 
       { 
        var essay1 = new Essay(); 
        essay1.GenerateEssays(essaylist[1]); 
       } 

Я затем создать 2 темы, которые выполняются этот код

public void StartThread(List<Essay> essaylist) 
    { 
     var essay = new Essay(); 
     List<System.Threading.Tasks.Task> tasklist = new List<System.Threading.Tasks.Task>(); 
     int threadcount = 7; 
     Boolean threadcomplete = false; 
     int counter = 0; 
     for (int i = 0; i < essaylist.Count; i++) 
     {    
      essay = essaylist[i]; 
      var task1 = System.Threading.Tasks.Task.Factory.StartNew(() => essay.GenerateEssays(essay)); 
      tasklist.Add(task1); 
      counter++; 
      if (tasklist.Count % threadcount == 0) 
      { 
       tasklist.ForEach(t => t.Wait()); 
       //counter = 0; 
       tasklist = new List<System.Threading.Tasks.Task>(); 
       threadcomplete = true; 
      } 
      Thread.Sleep(100); 
     } 
     tasklist.ForEach(t => t.Wait()); 
     Thread.Sleep(100); 
    } 

Для большинства файлов, код работает как положено. Однако, например, у меня есть 155 элементов, которые необходимо преобразовать. Когда программа заканчивается, и я смотрю на результаты, у меня есть 149 предметов вместо 155. Кажется, что результаты - это что-то вроде total = list - threadcount. В этом случае его 7. Любые идеи о том, как исправить это? Действительно ли я правильно выполняю потоки/задачи?

Также код essay.GenerateEssays является фактическим itextsharp, который преобразует информацию из db в фактический pdf.

+0

Постарайтесь либо имея Visual Studio перехватывать все исключения (Debug-> Исключение, проверьте ВСЕ) или положить в своих собственных примерках догоняющего выставить заявление в вызове задачи. .. Исключения в боковых потоках не автоматически приводят к сбою программы (что глупо, но понятно), так что может (акцент на «это может быть не так»), что некоторые из ваших задач рушится. – IdeaHat

+0

Это не должно вызывать вас на столько, сколько вы есть, но я полагаю, что вы должны иметь [для (int i = 0; i <= essaylist.Count/2; i ++)] в первой строке. – Cemafor

+0

для разделения списка вы можете использовать: 'front = essayList.Take (essayList.Count/2); back = essayList.Skip (essayList.Count/2); ' – Letterman

ответ

5

Как об использовании TPL. Кажется, что весь ваш код может быть заменен с этим

Parallel.ForEach(essaylist, essay => 
{ 
    YourAction(essay); 
}); 
+0

@Marco и' Parallel.ForEach' ждут завершения всей работы :) – I4V

+0

Просто поймите это. Спасибо – Marco

+1

Кажется, все работает отлично. Мне жаль, что я не потратил несколько дней, пытаясь понять это. спасибо – gmalenko