0

这是我第一次在一个项目中尝试多个线程,所以请耐心等待。这个想法是这样的。我有一堆需要转换为 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 个。看起来结果类似于总 = 列表 - 线程数。在这种情况下,它是 7。关于如何纠正这个问题的任何想法?我是否正确地执行线程/任务?

此外,essay.GenerateEssays 代码是将信息从 db 转换为实际 pdf 的实际 itextsharp。

4

1 回答 1

5

使用TPL怎么样。看来你所有的代码都可以用这个替换

Parallel.ForEach(essaylist, essay =>
{
    YourAction(essay);
});
于 2013-04-02T20:18:38.867 回答