Примечание: Если есть кто-то более знающий, который может сказать мне, почему это не хорошо, пожалуйста, сделайте.
Через некоторое время, пытаясь понять это, я понял, что файлы * .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();
}