Генерировать сообщение об ошибке, когда в коде используется async void

Есть много вопросов и ответов по теме async void. И мы все согласны с тем, что это нехорошо, и я считаю, что во всех случаях этого можно избежать. Вот почему я хочу создать сообщение об ошибке Visual Studio при его использовании.

В других случаях это был успех, например: когда функция возвращается с Task, визуальная студия выдает предупреждение CS4014. И мы настроили дескриптор этого предупреждения как ошибки с помощью Directory.Build.props. Вот его код:

<Project>
  <PropertyGroup>
    <WarningsAsErrors>CS4014</WarningsAsErrors>
  </PropertyGroup>
</Project>

Как видите, CS4014 как обрабатывается как ошибка. Это работает нормально. Но для async void нет предупреждающего сообщения, поэтому мы не можем настроить обработку этого как ошибки.

Есть ли способ добавить собственные сообщения об ошибках/предупреждения в процесс сборки msbuild?

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


person György Gulyás    schedule 04.04.2020    source источник
comment
Однако есть один вариант использования async void — это обработчики событий.   -  person 41686d6564    schedule 04.04.2020
comment
С помощью функции-оболочки вы также можете справиться с этим случаем.   -  person György Gulyás    schedule 04.04.2020
comment
Вы можете написать анализатор для обнаружения асинхронной пустоты, а затем генерировать свои собственные ошибки/предупреждения.   -  person pinkfloydx33    schedule 04.04.2020


Ответы (1)


Есть ли способ добавить пользовательские сообщения об ошибках/предупреждениях в процесс сборки msbuild?

Существует расширение VS под названием AsyncFixer, которое может обнаруживать асинхронные методы void.

Однако он просто превращает эти асинхронные методы void в предупреждения, а не в ошибки. И похоже, что режим WarningsAsErrors xml для него не работает.

Итак, если вы все еще хотите рассматривать их как ошибки, я предлагаю вам создать новую конфигурацию с именем Production в VS IDE, а затем добавить их в Directory.Build.props:

<Project>
 <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Production|AnyCPU'">
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
</Project>

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

Подробнее об этой функции вы можете узнать в это связанное дело.

Кроме того, если он по-прежнему вас не удовлетворяет, вам следует создайте анализатор для обнаружения асинхронных методов.

Надеюсь, это поможет вам.

person Mr Qian    schedule 14.04.2020