将线程/后台工作者放在一类中是“错误的” /错误的设计吗?


15

我有一个可以从Excel中读取的类(C#和.Net 4),在该类中,我有一个后台工作程序,该工作程序将从Excel加载数据,同时UI可以保持响应。我的问题如下:在班级中有一名后台工作人员是不好的设计吗?我是否应该在没有该类的情况下创建我的课程,并使用后台工作者对该课程进行操作?我看不到以这种方式创建课程的任何问题,但是我还是新手,所以我认为在继续之前必须确定。

我希望这个问题在这里有意义,因为我认为在我的代码正常工作时,它不应该出现在stackoverflow上,这只是一个设计问题。


3
您为什么认为这可能是错误的?
Alb

1
@Alb-很难说。我的代码可以工作并满足我的需求,但是,我计划在将要开源的项目中使用它。我想确保我的代码不会“正常工作”并且实际上设计得很好。
杰蒂2011年

Answers:


21

我是否应该在没有该类的情况下创建我的课程,并使用后台工作者对该课程进行操作?

是的你应该。我将告诉您原因-您违反了“ 单一责任原则”。通过与访问的Excel文档类紧密耦合怎么它访问的Excel文档,你消除“控制器”代码的能力(任何代码使用此)做它用不同的方式。您可能会问有什么不同?如果控制器代码有两个操作需要很长时间但又希望它们是顺序的,该怎么办?如果允许控制器处理线程,则它可以在一个线程中一起执行两个长期运行的任务。如果您想从非UI上下文访问excel文档并且不需要对其进行线程化怎么办?

通过将线程转移到调用方的责任,您可以提高代码的灵活性,使其更可重用。


2
+1用于回答所提出的实际问题并很好地回答。
亚当李尔

+1-谢谢Nemi。您在现场回答了我的问题,我对此表示赞赏。我将把它从我的课堂上拉出来,放到新的课堂上,再次谢谢!
杰蒂2011年

@Nemi-因此,如果我创建了另一个将同步加载并具有异步方法的方法,这是否可以接受?还是只有一种同步加载方法再从那里开始更好?
杰蒂2011年

1
我个人没有同步方法和异步方法。您仍在承担责任。我已经为这个确切的问题工作了很多次。我所做的是创建了一个TaskController,该TaskController是根据SwingWorker建模的,但是具有针对我们应用程序的特定代码。TaskController进行了诸如更新进度条,更改鼠标光标等操作。似乎总是需要创建TaskController进行调用的样板代码,但最终该代码更健壮和更易于维护。
米(Nemi)

谢谢内米!我希望我能再次支持你,因为你肯定回答了我的问题,并向我指出了正确的方向。再次感谢你!!
杰蒂2011年

3

UI操作在与后台任务分开的线程中进行操作是一个很好的设计。否则,当应用程序繁忙时,UI将变得无响应。

如果您可以将在后台线程中工作的部分划分为自己的类,则代码将更加简洁。


1
尽管是正确的,但从我阅读他的问题的方式来看,他在理解这一点上没有问题。
米(Nemi)

如果我的问题被误读了,我感到抱歉。我知道将UI和后台任务分开是一个很好的设计(如果没有必要,我的测试excel文件超过8k行,这会使程序显得无响应)。我的问题基本上是将线程与Excel类紧密耦合是否好。
杰蒂2011年

0

我将使用单独的类将UI与后台任务分开。这样做鼓励分离关注点。UI代码和业务逻辑不应混在一起。


只是要清楚一点,我的班级没有接触过UI。它有两个事件,允许任何需要使用它来更新UI的事件,但是我的类本身并不接触UI。
杰蒂2011年

0

我回想起BackgroundWorkers,他们提供了许多便利的方法,例如将进度更新发送到UI的能力。没有规则说您不能在其他类中使用它。

另外,如果您执行的迭代不需要按特定顺序处理项目,请考虑改用ThreadPool(或者,如果您使用的是.NET 4,请使用Task Parallel Library)。


感谢您的答复。我在我的课程中创建了两个事件,这些事件将触发进度(基本上是包装BackgroundWorker进度事件,因为BackgroundWorker是私有的),它将进度发送到UI(进度条)。
杰蒂2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.