Как мне избавиться от предупреждений CS4014 для файлов * .g.cs?

#c# #xaml #uwp #windows-template-studio

#c# #xaml #uwp #windows-template-studio

Вопрос:

Я получаю предупреждение CS4014 в Visual Studio, разрабатывающей приложения UWP, и не могу понять, что с ними делать. Я знаю, что есть способ подавить их в VS, но я не хочу полностью подавлять все предупреждения CS4014.

Предупреждение CS4014 Поскольку этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова. Рассмотрите возможность применения оператора ‘await’ к результату вызова.

Причина, по которой это вызывает беспокойство, заключается в том, что оно отображается в файлах * .g.cs, которые автоматически генерируются VS, я полагаю.

Ответ №1:

Примечание: Если есть кто-то более знающий, кто может сказать мне, почему это нехорошо, пожалуйста, сделайте.

Через некоторое время, пытаясь разобраться в этом, я понял, что файлы * .g.cs генерируются из моего XAML. Предупреждение отображается для событий, связанных с методами в моей ViewModel, которые не являются синхронными (?)

Пример страницыexample.xaml.g.cs:

 case 15: // ViewsPageExample.xaml line 72
    this.obj15 = (global::Windows.UI.Xaml.Controls.ToggleMenuFlyoutItem)target;
    this.obj15Click = (global::System.Object p0, global::Windows.UI.Xaml.RoutedEventArgs p1) =>
    {
        //Warning CS4014 because of line below. 
        //I can add await before this line all I want, 
        //but the file gets regenerated anyway.
        this.dataRoot.ViewModel.Refresh();
    };
    ((global::Windows.UI.Xaml.Controls.ToggleMenuFlyoutItem)target).Click  = obj15Click;
    this.bindingsTracking.RegisterTwoWayListener_15(this.obj15);
    break;
  

Пример страницы XamlExample.xaml:

 <ToggleMenuFlyoutItem Text="Toggle" Click="{x:Bind ViewModel.Refresh}" />
  

Пример ViewModel.cs:

 //Warning CS4014 on the .g.cs file because this is async
public async Task Refresh()
{
      //code you actually want
}
  

Я попытался просто изменить async void метод на Refresh on, но, похоже, это привело к проблемам с синхронизацией в моем случае.
Это то, что, кажется, работает. Некрасиво, но, похоже, устраняет предупреждение.

ViewModel.cs:

 //No more warning CS4014 since it's async void
public async void Refresh()
{
      await RefreshAsync();
}
public async Task RefreshAsync()
{
      //code you actually want
}
  

Согласно комментарию Джона, я полагаю, это разумно:

 //no need to be async void
public void Refresh()
{
    //discard
    _ = RefreshAsync();
}
  

Комментарии:

1. По сути, похоже, что сгенерированный код должен Refresh() быть синхронным. Можете ли вы вместо этого написать код синхронного обновления и вызвать свой метод асинхронного обновления RefreshAsync ?

2. Привет, Джон! Имеет смысл. Отредактировано, надеюсь, в соответствии с тем, что вы только что сказали.

3. Нет, это все еще обновляется асинхронно. Вам либо нужно иметь возможность обновляться синхронно, либо каким-то образом изменять сгенерированный код (например, с помощью скрипта, который после генерации выполняет правильные действия, как вариант взлома).

4. Хм. RefreshAsync усеян await строками, которые, на мой взгляд, сложнее преобразовать, поэтому RefreshAsync их можно сделать синхронными (перенести на Refresh ). Это тоже хакерство. Правильно?

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