我正在编写一个Win Forms应用程序,使用报表查看器创建多个PDF文件。这些PDF文件分为4个主要部分,每个部分负责创建特定的报告。这些进程将创建至少1个文件,最多可达到用户数量(目前为50)。
该程序已经存在并按顺序使用了这4种方法。为了在用户数量增加时获得额外的性能,我想将这些方法从主线程中分离出来,以4个单独的线程运行。
虽然我是C#中的新手,但我阅读了许多关于如何实现多线程的文章。唯一我不确定的是应该从哪里开始。由于我阅读了多篇博客文章,我不确定是要使用4个单独的线程,线程池还是多个后台工作者。(或者并行编程是最好的方法?)。博客文章告诉我,如果使用3个以上的线程,请使用线程池,但另一方面,他们告诉我,如果使用WinForms,请使用BackgroundWorker。哪个选项最好(为什么)?
最后,在继续之前,我的主线程必须等待所有进程结束。
有人可以告诉我解决问题的最佳方案吗?
*编辑后的额外信息*
我忘记告诉大家(在阅读了您所有的评论和可能的解决方案之后)。这些方法仅共享一个“IEnumerable”以供读取。在触发这些方法(不必按顺序运行)之后,这些方法会触发事件以向UI发送状态更新。我认为,如果使用单独的线程触发事件将会很困难,甚至不可能,因此应该有某种回调函数来报告运行时的状态更新。
以下是一些伪代码示例。
该程序已经存在并按顺序使用了这4种方法。为了在用户数量增加时获得额外的性能,我想将这些方法从主线程中分离出来,以4个单独的线程运行。
虽然我是C#中的新手,但我阅读了许多关于如何实现多线程的文章。唯一我不确定的是应该从哪里开始。由于我阅读了多篇博客文章,我不确定是要使用4个单独的线程,线程池还是多个后台工作者。(或者并行编程是最好的方法?)。博客文章告诉我,如果使用3个以上的线程,请使用线程池,但另一方面,他们告诉我,如果使用WinForms,请使用BackgroundWorker。哪个选项最好(为什么)?
最后,在继续之前,我的主线程必须等待所有进程结束。
有人可以告诉我解决问题的最佳方案吗?
*编辑后的额外信息*
我忘记告诉大家(在阅读了您所有的评论和可能的解决方案之后)。这些方法仅共享一个“IEnumerable”以供读取。在触发这些方法(不必按顺序运行)之后,这些方法会触发事件以向UI发送状态更新。我认为,如果使用单独的线程触发事件将会很困难,甚至不可能,因此应该有某种回调函数来报告运行时的状态更新。
以下是一些伪代码示例。
main()
{
private List<customclass> lcc = importCustomClass()
export.CreatePDFKind1.create(lcc.First(), exportfolderpath, arg1)
export.CreatePDFKind2.create(lcc, exportfolderpath)
export.CreatePDFKind3.create(lcc.First(), exportfolderpath)
export.CreatePDFKind4.create(customclass2, exportfolderpath)
}
namespace export
{
class CreatePDFKind1
{
create(customclass cc, string folderpath)
{
do something;
reportstatus(listviewItem, status, message)
}
}
class CreatePDFKind2
{
create(IEnumerable<customclass> lcc, string folderpath)
{
foreach (var x in lcc)
{
do something;
reportstatus(listviewItem, status, message)
}
}
}
etc.......
}