从工人类返回状态

本文关键字:状态 返回 人类 | 更新日期: 2023-09-27 18:11:15

我有一个service类和一个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类并调用了该方法。问题是,如何获得服务类中处理的任务数?

我想到了三个选择:

  1. 从worker类公开一个事件。在服务类中挂起一个事件处理程序

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

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

获取状态的干净方法是什么?

从工人类返回状态

前两个选项实际上在功能上是相同的。两者都可以很好地完成你需要做的事情。第二个选项暗示委托是必需的,而第一个选项暗示委托不是必需的。事件也可能意味着它的使用范围超出了这个方法的范围。

对于第三种选择,当号码更新时,它不给调用者执行代码的机会,它只是给他们访问信息的机会。

因此,如果这种类型的调用者需要对这个信息做一些事情(每次值改变时),那么你应该使用与前两个选项中的一个类似的东西,以便worker可以将信息"推送"给调用者。

如果调用者想要在需要信息的时候从worker那里"拉出"信息,那么使用第三个选项。

请注意,还有一个Progress类,你可以使用相应的IProgress接口,这与你的前两个选项相当,但是专门为工人更新UI与进度定制的。

对于使用后台任务的进度来更新UI, push和pull方法实际上都是明智的。如果进程不经常发生,那么每次进程发生变化时更新UI是有意义的,所以UI将希望在这些更新发生时得到"通知"。如果更新非常频繁,那么UI可能会想要一个计时器,并每隔一段时间拉出当前状态,以避免UI因超过所需或超出其可处理的更新而负担过重。

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

当然,如果你正在编写一个足够一般化的worker,你可能想要向同时公开一个push和pull机制,让调用者选择合适的一个