Как я уже писал в заметке о делегатах при возникновении исключения в одном из методов из списка делегата - остальные вызываться не будут. Как же обойти это?
Первое что приходит в голову - сделать некий утилитарный класс и метод для работы с делегатами:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3P7BmJD4X71CE4bpAdD-ETsUEw1iXnhK-7LuPq6QvyCw0iDO8U0OBmypIwg3EE_nPeHwy6F-b-426nXpZo_nzy03i_wjVoT8dytMNwg_vkR3xbqGmpLbfgTID49P_7Nccial2NKY3cyZQ/s1600/2014-09-05_222854.png)
Так как здесь мы понятия не имеем сигнатуру какого метода будут описывать делегат del, ожидаем что это будет событие и используем метод DynamicInvoke.
Тест для проверки:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP-9E6w53BWsM59nD6wPJtIbEW-evmPb-HQJenu12ZQIIGIYoTAUT09Pso_2HvAbSTi8EWY7pyW_deavqq4iVYBALxc4h_WwHgRISMEqva7moStRbyLElPQawBcC8zF3iU0sj8s5iwRxZq/s1600/2014-09-05_223832.png)
Сразу было очевидно что метод DynamicInvoke будет использовать рефлексию для вызова целевого метода, что конечно отразится на производительности. Кроме рефлексии на производительность повлияет создание массива аргументов, их упаковка/распаковка при необходимости, проверка что аргументы "подходят" для целевого метода и т.д.
В качестве варианта решил передавать еще один делегат, который бы использовался для вызова целевых методов первого делегата:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifCyFPq1BDUhn3-OE9uNKZolU2mKkMadnVwIwthGUJw-foKzgJlFoq4qQRSsmPpinnDvPCXQto8BZVI0qRmeg-FDEAF-4txXn7pBdcI0IQNlNwQVTiFX8JY8CF2JsZYEH5PaMv0q4L3csl/s1600/2014-09-05_224347.png)
Тоже самое можно сделать и для событий.
Для измерения времени выполнения использовал метод, который ничего не делает и 5 млн. его вызовов в цикле:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdqE7jjNF3qmKfuJ9Ja5pUrwcEa9GO9lHlEIPQVE2SZ8zVLAL5LBY1AsA7VqhpJqPHbEYD1pyopQjQBV6SKwvhDSgH6frj4UENGEbYKNHaWs6YyQZ1goRy2E0zqVnw8kffd_FK5k2lNGUB/s1600/2014-09-05_225122.png)
Результаты следующие:
- метод Invoke - 00:00:00.0357
- метод DynamicInvoke - 00:00:03.856
- с использованием Action - 00:00:00.792
Исходный код можно скачать здесь.
Комментариев нет:
Отправить комментарий