我有一个服务类和一个工人类。 worker类完成所有处理。
class WorkerClass
{
public void ProcessWork(<params to the method>)
{
// Get the tasks from the DB.
// Call a 3rd party web service to process each of the tasks.
}
}
在我的服务类中,我实例化worker类并调用该方法。问题是,如何获得服务类中处理的任务数量?
我想到了3个选项:
从工人类中公开事件。在服务类中连接一个事件处理程序。
修改ProcessWork
方法的签名,使其接受委托:
public void ProcessWork(object obj1, Action<int, int> actionProgressTracker)
从worker类公开属性并获取服务类中的属性。每隔30秒刷新一次。
获得状态的干净方法是什么?
答案 0 :(得分:2)
前两个选项在功能上完全相同。两者都可以很好地满足您的需求。第二个暗示代表是必需的,而第一个暗示它不是。事件也可能意味着它的使用超出了这一方法的范围。
至于第三个选项,它不会给调用者提供在数字更新时执行代码的机会,它只是让他们有机会访问信息。
因此,如果此类型的调用者需要在每次值更改时使用此信息*时执行某些操作,那么您应该使用与前两个选项之一相当的内容,以便工作人员可以&#34;推&#34;给来电者的信息。
如果来电者想要&#34;拉&#34; 希望获取信息时来自工作人员的信息,然后使用第三个选项。
请注意,您还可以使用Progress
类,其中包含相应的IProgress
界面,与您的前两个选项相当,但专门针对工作人员更新而定制有进步的用户界面。
推送和拉取方法实际上对于使用后台任务的进度更新UI是合理的。如果不经常进行进展,则每次进度改变时更新UI都是有意义的,因此UI将希望被通知&#34;那些更新何时发生。如果更新非常频繁,那么UI可能希望改为使用计时器并且每隔一段时间就拉出当前状态,以避免使用比所需更新或者可以处理的更新更多的UI。
当然,如果您正在推送信息而不仅仅是完成百分比,那么重要的是不要丢失任何信息,在这种情况下,您的第三种方法不是&n这是一个选项,因为在两次提取之间可能会发生多次更新。
当然,如果您正在编写一个足够广泛的工作者,您可能希望公开两者一个推拉机制,让调用者选择合适的工具。