从工人阶级返回状态

时间:2014-07-03 15:52:24

标签: c#

我有一个服务类和一个工人类。 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个选项:

  1. 从工人类中公开事件。在服务类中连接一个事件处理程序。

  2. 修改ProcessWork方法的签名,使其接受委托:

    public void ProcessWork(object obj1, Action<int, int> actionProgressTracker)
    
  3. 从worker类公开属性并获取服务类中的属性。每隔30秒刷新一次。

  4. 获得状态的干净方法是什么?

1 个答案:

答案 0 :(得分:2)

前两个选项在功能上完全相同。两者都可以很好地满足您的需求。第二个暗示代表是必需的,而第一个暗示它不是。事件也可能意味着它的使用超出了这一方法的范围。

至于第三个选项,它不会给调用者提供在数字更新时执行代码的机会,它只是让他们有机会访问信息。

因此,如果此类型的调用者需要在每次值更改时使用此信息*时执行某些操作,那么您应该使用与前两个选项之一相当的内容,以便工作人员可以&#34;推&#34;给来电者的信息。

如果来电者想要&#34;拉&#34; 希望获取信息时来自工作人员的信息,然后使用第三个选项。

请注意,您还可以使用Progress类,其中包含相应的IProgress界面,与您的前两个选项相当,但专门针对工作人员更新而定制有进步的用户界面。

推送和拉取方法实际上对于使用后台任务的进度更新UI是合理的。如果不经常进行进展,则每次进度改变时更新UI都是有意义的,因此UI将希望被通知&#34;那些更新何时发生。如果更新非常频繁,那么UI可能希望改为使用计时器并且每隔一段时间就拉出当前状态,以避免使用比所需更新或者可以处理的更新更多的UI。

当然,如果您正在推送信息而不仅仅是完成百分比,那么重要的是不要丢失任何信息,在这种情况下,您的第三种方法不是&n这是一个选项,因为在两次提取之间可能会发生多次更新。

当然,如果您正在编写一个足够广泛的工作者,您可能希望公开两者一个推拉机制,让调用者选择合适的工具。