Вложенный Linq Min () дает сбой Visual Studio - PullRequest
12 голосов
/ 22 июля 2009

У меня есть фрагмент кода, который делает Visual Studio 2008 IDE очень медленным, потребляет огромные объемы памяти и в конечном итоге приводит к его аварийному завершению. Я подозреваю, что VS достигает предела памяти ОС.

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

class LinqTest
{
    public class test
    {
        public int val;
        public List<test> Tests;
    }

    private void CrashMe()
    {
        test t = new test();

        //Uncomment this to cause the problem
        //var x = t.Tests.Min(c => c.Tests.Min(d => d.Tests.Min(e => e.Tests.Min(f=>f.Tests.Min(g=>g.Tests.Min(h => h.val))))));
    }
}

Кто-нибудь еще видел нечто подобное?

Ответы [ 7 ]

3 голосов
/ 31 июля 2009

Некоторое время назад я отправил сообщение об ошибке в MS Connect . Сегодня утром я получил ответ:

Спасибо за сообщение об ошибке в Visual Studio 2008!

Как вы указали в своем сообщении из блога Эрика Липперта, у нас есть ограничения на нашу способность делать вывод типов для таких вложенных лямбда-выражений в разумные сроки. Тем не менее, мы, безусловно, могли бы попытаться ограничить время такого вывода или установить жесткое ограничение на лямбда-вложение, чтобы предотвратить этот тип проблемы. К сожалению, мы начинаем блокировать то, что мы можем исправить в Visual Studio 2010, и мы не сможем применить такие ограничения в этом выпуске.

Мы обязательно учтем эту проблему при планировании будущих выпусков!

Алекс Тернер

Диспетчер программ

Компилятор Visual C #

и

Обновлен следующий элемент обратной связи, отправленный вами в Microsoft Connect: Продукт / Технология - Visual Studio и .NET Framework - Идентификатор обратной связи - 476133 Заголовок отзыва - Вложенный Linq Min () аварийно завершает работу Visual Studio 2008 IDE. Изменены следующие поля или значения : Статус поля изменен с [Активно] на [Разрешено]

Разрешение поля изменено с [Нет] на [Не будет исправлено]

3 голосов
/ 22 июля 2009

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

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

3 голосов
/ 22 июля 2009

Мне удалось воспроизвести это при установке Visual Studio 2008. Похоже, что языковая служба находится в бесконечном цикле и в конце концов исчерпывает память. Не могли бы вы сообщить об ошибке на сайте подключения?

Подключение: http://connect.microsoft.com

Если вы регистрируете ошибку, добавьте комментарий к моему ответу с номером ошибки.

1 голос
/ 22 июля 2009

Использование базовой рекурсии вместо попытки «угадать» глубину, увеличивая сложность на каждом уровне

public static class TestExt
{
    public static int Min(this Test test)
    {
        return Math.Min(test.val, test.Tests.Min(x => x.Min()));
    }
}
public class Test
{
    public int val;
    public List<Test> Tests;
}

public class LinqTest
{
    public void GetMin()
    {
        Test t = new Test();
        var min = t.Min();
    }
}

Как отметил Райан Версо, вы также можете сделать это без таких методов расширения, как:

public class Test
{
    public int val;
    public List<Test> Tests;

    public int Min()
    {
        return Math.Min(val,Tests.Min(x => x.Min()));
    }
}
0 голосов
/ 19 декабря 2009

Я думаю, что только что испытал нечто подобное. Я просматривал свой код и использовал var в строках, где я объявлял и инициализировал переменные в new SomeClass(). Мой код скомпилирован. Когда я пытался запустить какой-либо модульный тест Visual Studio 2008, Visual Studio зависал с CLR20r3 в качестве имени / типа ошибки. Отменяя все мои var изменения, тесты выполняются нормально.

0 голосов
/ 22 июля 2009

Я бы сказал, что он также замораживает VS 2010, и более того, он почти заморозил всю мою систему!

0 голосов
/ 22 июля 2009

Тебе даже не нужно заходить так далеко. VS застыл для меня при вводе части d вложенного выражения LINQ.

...