我正在构建一个简单的类来保存相关的方法。此代码的一部分包括同步到数据库。内置的SyncOrchestrator
类包含一个SessionProgress事件处理程序,我可以将事件连接到。
我想要做的是实例我的课程,然后将一些代码连接到此事件,以便我可以显示进度条(不能使用BGWorker)。
所以,我的问题可能是c#101,但是如何通过我的班级以正确的方式公开这个事件,以便我可以将其连线?
由于
答案 0 :(得分:4)
我认为你正在寻找这样的东西:
(我还建议您阅读Events tutorial on MSDN。)
public class SyncOrchestrator
{
// ...
public event EventHandler<MyEventArgs> SessionProgress;
protected virtual void OnSessionProgress(MyEventArgs e)
{
// Note the use of a temporary variable here to make the event raisin
// thread-safe; may or may not be necessary in your case.
var evt = this.SessionProgress;
if (evt != null)
evt (this, e);
}
// ...
}
MyEventArgs
类型派生自EventArgs
基类型并包含您的进度信息。
您可以通过调用OnSessionProgress(...)
来提升课程内的活动。
通过执行以下操作在任何消费者类中注册您的事件处理程序:
// myMethodDelegate can just be the name of a method of appropiate signature,
// since C# 2.0 does auto-conversion to the delegate.
foo.SessionProgress += myMethodDelegate;
同样,使用-=
取消注册该事件;通常没有明确要求。
答案 1 :(得分:1)
像这样:
public event EventHandlerDelegate EventName;
EventHandlerDelegate
显然应该是您希望人们提供给事件处理程序的委托类型的名称,如下所示:
anObject.EventName += new EventHandlerDelegate(SomeMethod);
调用事件时,请确保使用此模式:
var h = EventName;
if (h != null)
h(...);
否则,您可能会在测试和实际调用事件之间使事件处理程序变为null
。