Использование Async V3 без его установки

У меня проблема с установкой VS-SP1 и Async CTP V3 на мою машину. По какой-то причине это приводит к сбою любого приложения.NET, которое я запускаю на этой машине. (хорошо, что я использую виртуальную машину и могу откатиться).

Я скопировал файл обновления csc.exe в каталог.NET Framework 4 в моем каталоге Windows.

Когда я строю свой проект с помощью msbuild из командной строки, все строится и прекрасно работает.

Когда я компилирую тот же проект из VS2010, я получаю ошибку времени компиляции, что ключевое слово async неизвестно.

Мне все равно, что VS не выделяет синтаксис async и await, но меня беспокоит, что я должен построить проект из командной строки.

  1. Почему командная строка csc работает, а при использовании VS - нет?

  2. Как я могу изменить VS для правильной компиляции асинхронного кода (без установки самого Async CTP)?

Спасибо,

Я делаю.

1 ответ

Решение

VS2012 и пакет таргетинга Async - лучший вариант по следующим причинам:

  1. Синтаксис такой же, как в C#5, что упрощает обновление до C#5. Async CTP имеет достаточно различий (TaskEx вместо классов Task, TaskAsync вместо суффиксов Task, параметры токена и т. Д.), Что делает обновление неудобным. Не сложно, просто неприятность
  2. Ожидание / асинхронное поведение намного лучше и ближе к C#5. В Async CTP исключение, которое происходит внутри цикла, приведет к сбою всего цикла. См. Повторить задачу для сценария, на который влияет это.
  3. Там нет проблем с установкой. Async CTP и VS 2010 SP1 должны были быть установлены в определенном порядке, чтобы избежать проблем.
  4. Вы можете ожидать какой-то поддержки от MS для пакета таргетинга, в то время как вы не можете ожидать никакой поддержки для пакета Async.

Небольшое предостережение заключается в том, что установка VS2012 на компьютере с VS2010 + Async CTP нарушает Async CTP. Вы больше не сможете использовать версию VS2010 для компиляции асинхронного кода.

В качестве примера, где важно асинхронное поведение, рассмотрим следующий очень простой способ повторного выполнения задачи. В то время как функция компилируется с Async CTP, она завершается сбоем БЕСШУМНО (как при тихом завершении приложения), если происходит исключение

private static async Task<T> Retry<T>(Func<T> func, int retryCount)
{
    while (true)
    {
        try
        {
            var result = await Task.Run(func);
            return result;
        }
        catch
        {
            if (retryCount == 0)
                throw;
            retryCount--;
        }
    }
}

Тем не менее, я использую Async CTP уже более года, и единственной проблемой был порядок установки после добавления Visual Studio 2010 SP1. Если вы ошиблись в заказе, Asycn CTP не будет установлен, и вам придется удалить SP1 и переустановить все в правильном порядке.

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

Другие вопросы по тегам