Подтвердить что ты не робот

Невозможно оценить выражение, потому что поток остановлен в точке, где сбор мусора невозможно

Вот ошибка

Невозможно оценить выражение, потому что поток остановлен в точке, где сбор мусора невозможно, возможно, потому что код оптимизирован.

Я пишу просто консольное приложение, и первая строка кода такова:

List<MyObjectModel> list = MyObjectModel.GetNonCompletedReturns();

и код для функции:

public static List<MyObjectModel> GetNonCompletedReturns()
{
    MyObject service = new MyObject();
    List<MyObject> entities = 
                      (from recs in service.Retrieve() where select recs).ToList();

    List<MyObjectModel> models = new List<MyObjectModel>();

    foreach (MyObject entity in entities)
    {
        models.Add(BindModel(entity));
    }

    return models;
}

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

Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

Эта ошибка срабатывает только тогда, когда вы пытаетесь использовать диалог Watch во время отладки. Попытайтесь использовать какой-либо другой метод для вывода переменных, таких как Debug.WriteLine, Console.WriteLine и т.д.

Ответ 2

Если ваш проект скомпилирован в версии (при включенной оптимизации), вы можете это увидеть. Вы пробовали конфигурацию DEBUG?

Ответ 3

Ни один из ответов не решил мою проблему, поэтому я опубликовал решение, которое помогло мне.

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

Поместите этот объект в свои параметры вместо всех разных переменных, обычно проблема больше не будет иметь места ".

Ответ 4

Вот небольшой трюк на всякий случай, если вы захотите изучить некоторые объекты, и вы не сможете изменить параметры:

Я создал вызов новой временной функции внутри функции, из которой я не мог наблюдать за своим объектом. Затем внутри этой новой функции я смог наблюдать за своим объектом. После выполнения задания просто удалите функцию.

Ответ 5

Если ваша конфигурация решения Visual Studio равна Release, переключитесь на Debug.

Ответ 6

Я получил это тоже, когда я ударил NullReferenceException из стороннего элемента управления.

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

Не знаю, почему, но это сработало для меня - в этом случае, по крайней мере.

Ответ 7

Для того, что стоит, эта ошибка также может быть вызвана бесконечным циклом в getter свойства (упрощенный вариант ниже). Когда отладчик пытается оценить свойство (например, в окне просмотра), пользовательский интерфейс будет висеть в течение нескольких секунд, а ошибка "Невозможно оценить выражение..." появится для многих других свойств в том же классе.

public int MyProperty
{
    get
    {
        while (true) { }
        return 0;
    }
}

Ответ 8

Хотя верно, что "Невозможно оценить выражение, потому что поток остановлен в точке, где сбор мусора невозможен, возможно, потому, что код оптимизирован". Ошибка появляется в режиме выпуска, большинство разработчиков просто обеспечивают, чтобы их проекты были настроены на скомпилировать как сборку отладки. НО, чтобы убедиться, что у вас нет проблем с выпуском DLL, вы также должны проверить ссылки на DLL, которые находятся в вашем решении, и убедиться, что у вас нет ссылки на DLL-версию. Если вы обнаружите, что это так, удалите ссылку на DLL, а затем добавьте ссылку на проект, а не ссылку на DLL. Ссылка на проект гарантирует, что ваше решение ссылается на отладку или выпуск версий DLL, как указано в конфигурации сборки.

Обратите внимание, что приведенные выше рекомендации относятся, конечно, только к тем библиотекам DLL, к которым у вас есть исходный код и которые построены из проекта в вашем решении.

Ответ 9

Сначала убедитесь, что вы запускаете свой код в режиме DEBUG и с отключенной оптимизацией кода. вы можете отключить это от свойств вашего проекта.

Если вы сделали все вышеперечисленное и проблема не устранена, то это, вероятно, проблема с тем, что стек имеет Debug.Break() поверх него. Решение для этого очень просто, просто нажмите F10, чтобы перейти к следующей строке, и вы сможете оценить выражение.

Вы можете проверить этот вопрос SO для получения дополнительной информации об этой проблеме.