C# 在.Net中安全调用事件的简明方法
是否有一种简洁的方法可以安全地调用C#Net中的事件。我想安全地处理没有订阅者和订阅者可能抛出的异常 我有点想在委托上使用TryInvoke方法。理想情况下,我也可以传递一个异常处理程序。我在.NET3.5中,所以没有扩展方法 无论如何,这是我通常使用的样板C# 在.Net中安全调用事件的简明方法,c#,events,C#,Events,是否有一种简洁的方法可以安全地调用C#Net中的事件。我想安全地处理没有订阅者和订阅者可能抛出的异常 我有点想在委托上使用TryInvoke方法。理想情况下,我也可以传递一个异常处理程序。我在.NET3.5中,所以没有扩展方法 无论如何,这是我通常使用的样板 void fireListChanged(List<string> paths) { try { if (ListChanged
void fireListChanged(List<string> paths)
{
try
{
if (ListChanged != null)
{
ListChanged(paths);
}
}
catch (System.Exception ex)
{
m_output.write(ex);
}
}
public event ListStringChangedDlgt ListChanged;
void fireListChanged(列表路径)
{
尝试
{
如果(ListChanged!=null)
{
列表更改(路径);
}
}
catch(System.Exception-ex)
{
m_输出写入(ex);
}
}
公共事件ListStringChangedLgt ListChanged;
只需使用=delegate{}
模式。与您的解决方案相比,它的优点是线程安全
void fireListChanged(List<string> paths)
{
try
{
ListChanged(paths);
}
catch (System.Exception ex)
{
m_output.write(ex);
}
}
public event ListStringChangedDlgt ListChanged = delegate {};
void fireListChanged(列表路径)
{
尝试
{
列表更改(路径);
}
catch(System.Exception-ex)
{
m_输出写入(ex);
}
}
公共事件liststringchangedlgt ListChanged=委托{};
我还建议您使用
EventHandler
或EventHandler
作为事件的委托。扩展方法仅在.Net 1.0、1.1和2.0中不可用,因此您可以使用它们。仅供参考,扩展方法是在.NET 3.0中引入的,但它们不是解决此问题的合适解决方案.NET 3.5附带的C#3.0确实有扩展方法。顺便说一句,如果事件的订阅者较多,其中一个会引发异常,其余的处理程序不会用代码调用。这是否也解决了如果调用的某个处理程序引发异常的问题?否则你无论如何都必须使用foreach()。我正在阅读一个优秀的代码项目页面上的C#events。在第7节的末尾,它简要地提到了对事件的GetInvocationList()
进行foreach,因此您可以引发所有事件,即使有一个事件引发了未处理的异常。这样做在生产代码中相当普遍吗?对每一件事都这样做感觉有点笨拙。