如何摆脱* .g.cs文件的CS4014警告?

时间:2019-04-20 07:51:31

标签: c# xaml uwp windows-template-studio

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

  

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

我认为麻烦的原因是它显示在* .g.cs文件中,这些文件是由VS自动生成的。

1 个答案:

答案 0 :(得分: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 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();
}