我有多个类在线程中执行冗长的任务,并希望它们输出某种进度,所以我可以将它显示到进度条或计数器。有什么方法提供进度信息的类
我可以使用接口中定义的事件或委托,但似乎每个实现都需要编写完全相同的FireEvent代码,以检查事件是否为空并将其提升,如果不是。
使用抽象类似乎也不好,因为这样的功能不属于顶级的类,这意味着我必须在不同的地方再次实现它。
我该如何以最可重复使用的方式做到这一点,而且无处不在?
我有多个类在线程中执行冗长的任务,并希望它们输出某种进度,所以我可以将它显示到进度条或计数器。有什么方法提供进度信息的类
我可以使用接口中定义的事件或委托,但似乎每个实现都需要编写完全相同的FireEvent代码,以检查事件是否为空并将其提升,如果不是。
使用抽象类似乎也不好,因为这样的功能不属于顶级的类,这意味着我必须在不同的地方再次实现它。
我该如何以最可重复使用的方式做到这一点,而且无处不在?
如果您为其他线程使用BackgroundWorker
,则可以使用ReportProgress
方法,该方法将引发ProgressChanged
事件。
http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx
不错!我喜欢学习像这样的新东西。无论如何,我都是新手。 – Cyberherbalist
我通常反向视图和使得视图知道关于模型的模型之间的关系。在这个例子中,进度对话框会提到一个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);
}
}
谢谢,但这是我试图避免实际。每当Progress改变事件被触发时,它都必须检查为空。它通常在RaiseEvent函数中,但每次都必须执行。我知道这并不多,但我宁愿冒火,忘记RaiseProgressChanged方法可用,我不需要每次需要时都实施它。 – Darcara
好的,是的,我也讨厌这个。这对语言来说更是一个问题。看看我的编辑,看看我如何应对这一点。 – vidstige
也许它不回答问题,但它非常有趣。 +1为解释它的额外努力。 – Cyberherbalist
为什么这样的功能不属于基类?基类的整个意义在于提供派生类之间的共享功能 –
为什么所有类都以相同的方式报告进度? – vidstige
@vidstige也许你为它分配一个进度条来更新它,并更新进度条。所有课程将更新分配的进度条。在这个例子中,他们都以相同的方式报告进度。 –