0

我在开发 UWP 应用程序的 Visual Studio 中收到 CS4014 警告,但不知道如何处理它们。我知道有一种方法可以在 VS 中抑制它们,但我不想完全抑制所有 CS4014 警告。

警告 CS4014 由于不等待此调用,因此在调用完成之前继续执行当前方法。考虑将“等待”运算符应用于调用结果。

我认为它令人不安的原因是它出现在 VS 自动生成的 *.g.cs 文件中。

4

1 回答 1

0

注意:如果有更博学的人可以告诉我为什么这不好,请这样做。

经过一段时间试图弄清楚这一点,我意识到 *.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 voidRefresh但它似乎有一个效果,在我的情况下导致了时间问题。这似乎有效。丑陋,但似乎解决了警告。

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();
}
于 2019-04-20T07:51:31.310 回答