如何在c#类中公开事件?

时间:2010-11-09 20:40:26

标签: c# events

我正在构建一个简单的类来保存相关的方法。此代码的一部分包括同步到数据库。内置的SyncOrchestrator类包含一个SessionProgress事件处理程序,我可以将事件连接到。

我想要做的是实例我的课程,然后将一些代码连接到此事件,以便我可以显示进度条(不能使用BGWorker)。

所以,我的问题可能是c#101,但是如何通过我的班级以正确的方式公开这个事件,以便我可以将其连线?

由于

2 个答案:

答案 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

另请参阅official documentation on MSDN