2011-11-17 68 views
4

我有多个类在线程中执行冗长的任务,并希望它们输出某种进度,所以我可以将它显示到进度条或计数器。有什么方法提供进度信息的类

我可以使用接口中定义的事件或委托,但似乎每个实现都需要编写完全相同的FireEvent代码,以检查事件是否为空并将其提升,如果不是。

使用抽象类似乎也不好,因为这样的功能不属于顶级的类,这意味着我必须在不同的地方再次实现它。

我该如何以最可重复使用的方式做到这一点,而且无处不在?

+3

为什么这样的功能不属于基类?基类的整个意义在于提供派生类之间的共享功能 –

+0

为什么所有类都以相同的方式报告进度? – vidstige

+0

@vidstige也许你为它分配一个进度条来更新它,并更新进度条。所有课程将更新分配的进度条。在这个例子中,他们都以相同的方式报告进度。 –

回答

2

我通常反向视图和使得视图知道关于模型的模型之间的关系。在这个例子中,进度对话框会提到一个IProgress接口。然后它会连接到一个ProgressChanged事件,并且视图可以在需要时自行更新。这样做的主要优点是不同类中的代码不会重复 - 只有告知剩下多少代码才是这些类中的代码。通过这种方式,可以非常容易地限制经常发布进度状态的类的进度更新。

只给你一个想法是什么,我通常做的:

interface IProgress 
{ 
    event EventHandler ProgressChanged; 
    int ProgressTarget { get; } 
    int CurrentProgress { get; } 
} 

而且一个实现类。我甚至不知道它是否应该像它应该那样工作 - 这只是给我一个关于如何实现这个接口的印象。

class StreamCopier: IProgress 
{ 
    private Stream _source; 
    private Stream _destination; 

    public StreamCopier(Stream source, Stream destination) 
    { 
     _source = source; 
     _destination = destination; 
    } 

    public void WriteAll() 
    { 
     int b; 
     while ((b = _source.ReadByte()) != -1) 
     { 
      _destination.WriteByte((byte)b); 
      EventRaiser.Raise(ProgressChanged, this); // Just one call here! Can't be less 
     } 
    } 

    public event EventHandler ProgressChanged; 

    public int ProgressTarget { 
     get { return (int)_source.Length; } 
    } 

    public int CurrentProgress { 
     get { return (int)_destination.Position; } 
    } 
} 

然后是EventRaiser类。注意处理器引用如何在参数堆栈上传递,因此不需要线程安全的副本到'tmp'! :)

static class EventRaiser 
{ 
    public static void Raise(EventHandler handler, object sender, EventArgs args) 
    { 
     handler(sender, args); 
    } 

    public static void Raise(EventHandler handler, object sender) 
    { 
     Raise(handler, sender, EventArgs.Empty); 
    } 
} 
+0

谢谢,但这是我试图避免实际。每当Progress改变事件被触发时,它都必须检查为空。它通常在RaiseEvent函数中,但每次都必须执行。我知道这并不多,但我宁愿冒火,忘记RaiseProgressChanged方法可用,我不需要每次需要时都实施它。 – Darcara

+0

好的,是的,我也讨厌这个。这对语言来说更是一个问题。看看我的编辑,看看我如何应对这一点。 – vidstige

+0

也许它不回答问题,但它非常有趣。 +1为解释它的额外努力。 – Cyberherbalist

相关问题