ExecutionEngineException возникает при вызове события PropertyChanged со слабыми обработчиками в C # - PullRequest
2 голосов
/ 16 марта 2012

Я пытаюсь вызвать событие PropertyChanged , которое прослушивается слабым обработчиком события (через PropertyChangedEventManager ). По какой-то причине я получаю ExecutionEngineException , когда я поднимаю событие.

Мой код повышения событий выглядит так:

protected virtual void RaisePropertyChanged(string aPropertyName)
{
    var lHandler = this.PropertyChanged;

    if (lHandler != null)
    {
        // ExecutionEngineException is thrown here
        lHandler(this, new PropertyChangedEventArgs(aPropertyName));
    }

    return;
}

Мой код обработки выглядит так:

public bool ReceiveWeakEvent(Type aManagerType, object aSender, EventArgs e)
{
    bool lHandled = false;

    if (aManagerType == typeof(PropertyChangedEventManager))
    {
        OnPropertyChanged(aSender, e as PropertyChangedEventArgs);
    }

    return lHandled;
}

Я не получаю никаких полезных результатов при поиске этого исключения, а само исключение не содержит никакой полезной информации! Что является причиной проблемы?

Ответы [ 2 ]

5 голосов
/ 16 марта 2012

Указывает автору исключения ExecutionEngineException при вызове события блога PropertyChanged .Он отлично описывает проблему и решение, но по какой-то причине его страница не очень высока в результатах веб-поиска.Я хотел опубликовать вопрос и ответ здесь, чтобы помочь большему количеству людей, которые сталкиваются с той же проблемой.

Так получается, что WeakEventManager вызовет Environment.FailFast () если вы вернете false из ReceiveWeakEvent .

Какая коварная ошибка!Я согласен с цитатой из записи в блоге:

Это может быть самая нелепо чрезмерно реактивная обработка ошибок, которую я когда-либо видел в своей жизни.

Мое исправленообработчик выглядит так:

public bool ReceiveWeakEvent(Type aManagerType, object aSender, EventArgs e)
{
    bool lHandled = false;

    if (aManagerType == typeof(PropertyChangedEventManager))
    {
        OnPropertyChanged(aSender, e as PropertyChangedEventArgs);
        lHandled = true;
    }

    return lHandled;
}
1 голос
/ 14 декабря 2015

Ссылка в принятом ответе больше недоступна (домен истек), но информация по-прежнему доступна через Wayback Machine.Я собираюсь повторить весь пост здесь, с благодарностью оригинальному автору.Если это не правильно, я уверен, что кто-то будет рядом, чтобы исправить это ...

ExecutionEngineException при вызове события PropertyChanged

Опубликовано 23 апреля 2009 г.ceiled, в (их?) блоге "Occam Says".

Если вы когда-либо видели исключение ExecutionEngineException в .NET, вы знаете, что это противно.Это даже звучит пугающе.Это ошибка, выдаваемая Environment.FailFast () - MSDN описывает ее как «исключение, которое выдается при возникновении внутренней ошибки в механизме выполнения общеязыковой среды выполнения».До прошлой ночи я видел это только один раз, когда генерировал и запускал свой собственный код сборки IL, и я делал что-то не так, например, выталкивал слишком много значений из стека или что-то в этом роде.

Однако последнееночью я получил его, когда вызывал событие PropertyChanged на своем объекте INotifyPropertyChanged, сразу после использования PropertyChangedEventManager для подписки на него.Я почесал голову ... как, черт возьми, мне удалось вызвать внутреннюю ошибку в CLR?Я перезапустил Visual Studio, перезагрузил свой компьютер, я попробовал его на других компьютерах, чтобы увидеть, не было ли это какой-то сумасшедшей коррупцией в моей системе, но это было полностью повторяемо.

Наконец, в отчаянии, я настроилПереход на исходный код .NET (что-то, что я собирался сделать какое-то время), и запуск его снова - на этот раз вместо того, чтобы показываться в строке, где я вызвал событие PropertyChanged, исключение остановилось для этого кода в WeakEventManager.cs:


bool condition = listener.ReceiveWeakEvent(managerType, sender, args);
if (!condition)
{
    Invariant.Assert(condition, SR.Get("ListenerDidNotHandleEvent"), SR.Get("ListenerDidNotHandleEventDetail", new object[] { listener.GetType(), managerType }));
}

Это верно… когда ReceiveWeakEvent возвращает false (указывает, что слушатель не обработал инициируемое событие), WeakEventManager вызывает Environment.FailFast ().Это программный эквивалент людей в фильмах ужасов, которые предпочитают стрелять себе в лицо, а не превращаться в зомби и, возможно, причинить боль своим друзьям.Он записывает событие в средство просмотра событий, которое говорит: «Неустранимая системная ошибка».

Это может быть самая нелепо чрезмерно реактивная обработка ошибок, которую я когда-либо видел в своей жизни, и по какой-то причине Google полностьюбесполезен в этом вопросе.Поиск «PropertyChangedEventManager ExecutionEngineException» практически ничего не дает - единственным результатом на английском языке был 404, и в кешированной версии Google по какой-то причине не было ни одного ключевого слова.Надеюсь, это спасет кого-то от сильного разочарования, которое я испытал, когда случайно возвратил false из обработчика случайных событий где-нибудь, и мне сказали, что мой механизм выполнения стал неисправно поврежденным и будет отключен для собственной защиты.Если этот пост поможет вам, пожалуйста, сообщите мне об этом в комментариях, чтобы я знал, что мое время не было потрачено впустую.

...