Это первый раз, когда я пытаюсь несколько потоков в проекте, так что несите меня. Идея такова. У меня есть куча документов, которые мне нужно преобразовать в 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.
Постарайтесь либо имея Visual Studio перехватывать все исключения (Debug-> Исключение, проверьте ВСЕ) или положить в своих собственных примерках догоняющего выставить заявление в вызове задачи. .. Исключения в боковых потоках не автоматически приводят к сбою программы (что глупо, но понятно), так что может (акцент на «это может быть не так»), что некоторые из ваших задач рушится. – IdeaHat
Это не должно вызывать вас на столько, сколько вы есть, но я полагаю, что вы должны иметь [для (int i = 0; i <= essaylist.Count/2; i ++)] в первой строке. – Cemafor
для разделения списка вы можете использовать: 'front = essayList.Take (essayList.Count/2); back = essayList.Skip (essayList.Count/2); ' – Letterman