Как избавиться от предупреждений CS4014 для файлов * .g.cs? - PullRequest
0 голосов
/ 20 апреля 2019

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

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

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

1 Ответ

0 голосов
/ 20 апреля 2019

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

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

Пример PageExample.xaml.g.cs:

case 15: // Views\PageExample.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;

Пример XAML PageExample.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, но, похоже, это вызвало проблемы с синхронизацией в моем случае. Это то, что, кажется, работает. Ужасно, но, кажется, адресует предупреждение.

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();
}
...