我有一个可以从Excel中读取的类(C#和.Net 4),在该类中,我有一个后台工作程序,该工作程序将从Excel加载数据,同时UI可以保持响应。我的问题如下:在班级中有一名后台工作人员是不好的设计吗?我是否应该在没有该类的情况下创建我的课程,并使用后台工作者对该课程进行操作?我看不到以这种方式创建课程的任何问题,但是我还是新手,所以我认为在继续之前必须确定。
我希望这个问题在这里有意义,因为我认为在我的代码正常工作时,它不应该出现在stackoverflow上,这只是一个设计问题。
我有一个可以从Excel中读取的类(C#和.Net 4),在该类中,我有一个后台工作程序,该工作程序将从Excel加载数据,同时UI可以保持响应。我的问题如下:在班级中有一名后台工作人员是不好的设计吗?我是否应该在没有该类的情况下创建我的课程,并使用后台工作者对该课程进行操作?我看不到以这种方式创建课程的任何问题,但是我还是新手,所以我认为在继续之前必须确定。
我希望这个问题在这里有意义,因为我认为在我的代码正常工作时,它不应该出现在stackoverflow上,这只是一个设计问题。
Answers:
我是否应该在没有该类的情况下创建我的课程,并使用后台工作者对该课程进行操作?
是的你应该。我将告诉您原因-您违反了“ 单一责任原则”。通过与访问的Excel文档类紧密耦合怎么它访问的Excel文档,你消除“控制器”代码的能力(任何代码使用此)做它用不同的方式。您可能会问有什么不同?如果控制器代码有两个操作需要很长时间但又希望它们是顺序的,该怎么办?如果允许控制器处理线程,则它可以在一个线程中一起执行两个长期运行的任务。如果您想从非UI上下文访问excel文档并且不需要对其进行线程化怎么办?
通过将线程转移到调用方的责任,您可以提高代码的灵活性,使其更可重用。
我将使用单独的类将UI与后台任务分开。这样做鼓励分离关注点。UI代码和业务逻辑不应混在一起。
我回想起BackgroundWorkers,他们提供了许多便利的方法,例如将进度更新发送到UI的能力。没有规则说您不能在其他类中使用它。
另外,如果您执行的迭代不需要按特定顺序处理项目,请考虑改用ThreadPool(或者,如果您使用的是.NET 4,请使用Task Parallel Library)。