Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.Net中安全调用事件的简明方法_C#_Events - Fatal编程技术网

C# 在.Net中安全调用事件的简明方法

C# 在.Net中安全调用事件的简明方法,c#,events,C#,Events,是否有一种简洁的方法可以安全地调用C#Net中的事件。我想安全地处理没有订阅者和订阅者可能抛出的异常 我有点想在委托上使用TryInvoke方法。理想情况下,我也可以传递一个异常处理程序。我在.NET3.5中,所以没有扩展方法 无论如何,这是我通常使用的样板 void fireListChanged(List<string> paths) { try { if (ListChanged

是否有一种简洁的方法可以安全地调用C#Net中的事件。我想安全地处理没有订阅者和订阅者可能抛出的异常

我有点想在委托上使用TryInvoke方法。理想情况下,我也可以传递一个异常处理程序。我在.NET3.5中,所以没有扩展方法

无论如何,这是我通常使用的样板

    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,因此您可以引发所有事件,即使有一个事件引发了未处理的异常。这样做在生产代码中相当普遍吗?对每一件事都这样做感觉有点笨拙。