我在开发 UWP 应用程序的 Visual Studio 中收到 CS4014 警告,但不知道如何处理它们。我知道有一种方法可以在 VS 中抑制它们,但我不想完全抑制所有 CS4014 警告。
警告 CS4014 由于不等待此调用,因此在调用完成之前继续执行当前方法。考虑将“等待”运算符应用于调用结果。
我认为它令人不安的原因是它出现在 VS 自动生成的 *.g.cs 文件中。
我在开发 UWP 应用程序的 Visual Studio 中收到 CS4014 警告,但不知道如何处理它们。我知道有一种方法可以在 VS 中抑制它们,但我不想完全抑制所有 CS4014 警告。
警告 CS4014 由于不等待此调用,因此在调用完成之前继续执行当前方法。考虑将“等待”运算符应用于调用结果。
我认为它令人不安的原因是它出现在 VS 自动生成的 *.g.cs 文件中。
注意:如果有更博学的人可以告诉我为什么这不好,请这样做。
经过一段时间试图弄清楚这一点,我意识到 *.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();
}