Ошибка: истекло время ожидания при вычислении функции "function", поэтому его требуется завершить небезопасным образом

Полный текст сообщения: вычисление времени ожидания функции "функция" и должно быть прервано небезопасным способом. Это могло привести к повреждению целевого процесса.

Чтобы упростить проверку состояния для объектов .NET, отладчик автоматически выполняет дополнительный код в отлаживаемом процессе (обычно это методы получения свойств и функции ToString). В большинстве случаев эти функции выполняются быстро и значительно упрощают отладку. Однако отладчик не запускает приложение в песочнице. Поэтому если метод получения свойств или метод ToString вызывает собственную функцию платформы и эта функция перестает отвечать, время ожидания может длиться бесконечно. Если вы увидите указанное выше сообщение об ошибке, значит возникла именно такая ситуация.

Одна из распространенных причин возникновения этой проблемы связана с тем, что когда отладчик вычисляет свойство, он разрешает выполнение только проверяемого потока. Поэтому если свойство ожидает выполнения других потоков в отлаживаемом приложении, причем среда выполнения .NET не может прервать это ожидание, возникает данная проблема.

Исправление ошибки

В следующих разделах приведено несколько возможных решений для этой проблемы.

Решение #1. Запретить отладчику вызывать свойство getter или метод ToString

В сообщении об ошибке будет указано имя функции, которую отладчик пытался вызвать. Если вы можете изменить эту функцию, запретите отладчику вызывать метод получения свойств или метод ToString. Выполните одно из следующих действий.

  • Укажите в методе любой другой тип кода, кроме метода получения свойств и метода ToString, и проблема исчезнет. –или–
  • (Для ToString.) Определите для типа атрибут DebuggerDisplay, чтобы отладчик мог вычислить другое значение, кроме ToString. –или–
  • (Для метода получения свойства.) Установите для свойства атрибут System.Diagnostics.DebuggerBrowsable(DebuggerBrowsableState.Never). Это может быть полезно, если какой-то из ваших методов должен оставаться свойством для обеспечения совместимости с API, хотя по сути является настоящим методом.

Решение #2. У целевого кода попросите отладчика прервать оценку.

В сообщении об ошибке будет указано имя функции, которую отладчик пытался вызвать. Если метод получения свойств или метод ToString иногда не выполняется правильно, особенно когда проблема в том, что коду требуется другой поток для выполнения кода, тогда функция реализации может вызвать System.Diagnostics.Debugger.NotifyOfCrossThreadDependency, чтобы запросить прерывание вычисления функции отладчиком. При использовании этого решения можно по-прежнему явно вычислять функции, но по умолчанию при вызове NotifyOfCrossThreadDependency выполнение останавливается.

Решение #3. Отключение всех неявных вычислений

Если ни одно из предыдущих решений не устраняет проблему, перейдите в раздел Средства>Параметры и снимите флажок Отладка>Общие>Включить вычисление свойства и другие неявные вызовы функций. Это отключит большинство неявных вычислений функций, что должно устранить проблему.

Решение 4. Проверка совместимости со сторонними средствами для разработчиков

Если вы используете Resharper, ознакомьтесь с рекомендациями в описании этой проблемы статье.

Решение 5. Включение режима совместимости управляемого кода

Если переключиться на модуль отладки прежней версии, можно устранить эту ошибку. Выберите пункт Сервис>Параметры, а затем выберите параметр Отладка>Общие>Использовать режим совместимости управляемого кода. Дополнительные сведения см. в статье Общие параметры отладки.