Использование Async V3 без его установки
У меня проблема с установкой VS-SP1 и Async CTP V3 на мою машину. По какой-то причине это приводит к сбою любого приложения.NET, которое я запускаю на этой машине. (хорошо, что я использую виртуальную машину и могу откатиться).
Я скопировал файл обновления csc.exe в каталог.NET Framework 4 в моем каталоге Windows.
Когда я строю свой проект с помощью msbuild из командной строки, все строится и прекрасно работает.
Когда я компилирую тот же проект из VS2010, я получаю ошибку времени компиляции, что ключевое слово async неизвестно.
Мне все равно, что VS не выделяет синтаксис async и await, но меня беспокоит, что я должен построить проект из командной строки.
Почему командная строка csc работает, а при использовании VS - нет?
Как я могу изменить VS для правильной компиляции асинхронного кода (без установки самого Async CTP)?
Спасибо,
Я делаю.
1 ответ
VS2012 и пакет таргетинга Async - лучший вариант по следующим причинам:
- Синтаксис такой же, как в C#5, что упрощает обновление до C#5. Async CTP имеет достаточно различий (TaskEx вместо классов Task, TaskAsync вместо суффиксов Task, параметры токена и т. Д.), Что делает обновление неудобным. Не сложно, просто неприятность
- Ожидание / асинхронное поведение намного лучше и ближе к C#5. В Async CTP исключение, которое происходит внутри цикла, приведет к сбою всего цикла. См. Повторить задачу для сценария, на который влияет это.
- Там нет проблем с установкой. Async CTP и VS 2010 SP1 должны были быть установлены в определенном порядке, чтобы избежать проблем.
- Вы можете ожидать какой-то поддержки от 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 год и пакет таргетинга, как только это будет практично (то есть вся команда готова перейти), чтобы избежать нескольких версий кода и раздражающего поведения исключений.