多线程和任务问题
本文关键字:问题 任务 多线程 | 更新日期: 2023-09-27 18:07:11
这是我第一次在一个项目中尝试多个线程,所以请原谅我。这个想法是这样的。我有一堆文件需要转换成pdf格式。我使用itextsharp为我做转换。当迭代运行时,程序运行得很好,但很慢。
我有一个需要转换的项目列表。我把这个列表分成两个列表。
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。对如何纠正这个问题有什么想法吗?我甚至做线程/任务正确吗?
还有这篇文章。GenerateEssays代码是将信息从db转换为实际pdf的实际文本。
使用TPL如何?似乎你所有的代码都可以用这个
代替Parallel.ForEach(essaylist, essay =>
{
YourAction(essay);
});