问题描述
我对 async void
和按钮处理程序感到困惑。我在视频教程中听说使用 async void
是不明智的。我已经查看了这些问题:
在许多答案中,它确实使用了这种语法。因此我的困惑。 ?
这是我的处理程序:
async private void InstallStyleButton_Clicked(object sender,EventArgs e)
{
var customFileType =
new FilePickerFileType(new Dictionary<DevicePlatform,IEnumerable<string>>
{
{DevicePlatform.macOS,new[] {"xsl"} }
});
var pickResult = await FilePicker.PickAsync(new PickOptions
{
FileTypes = customFileType,PickerTitle = "Select template to install"
});
if(pickResult != null)
{
// Build target path
string targetFile = Path.Combine("/Users/Shared/VisitsRota.MacOS/Styles",pickResult.FileName);
// OK to install?
if(!File.Exists(targetFile))
{
// Install
File.copy(pickResult.FullPath,targetFile);
// Add it
StylesPicker.ItemsSource.Add(pickResult.FileName);
// Select it
StylesPicker.SelectedItem = pickResult.FileName;
}
}
}
我意识到硬编码文件夹路径不是一个好主意,我最终会解决这个问题。除此之外,当我尝试时,我的处理程序似乎在我的开发 MacBook Pro 上运行良好。
我将 async void
与按钮处理程序一起使用可以吗?如果没有,我的处理程序应该如何调整?
解决方法
我在 link 处找到了它:
总结第一条准则,您应该更喜欢 async Task
而不是 async void
。 Async Task
方法使错误处理、可组合性和可测试性更容易。 此指南的例外是异步事件处理程序,它必须返回 void
。
所以我的代码没问题。