我有一个奇怪的问题,涉及async/await的使用:
我创建了一个小程序,基本上处理每个操作的try/catch:
当然,HandledAction得到调用并通过,因为它收到指针并抛出异常,但未被处理。
我想我必须创建一个AsyncHandledAction,并将该操作设置为异步执行,但是是否有更简单的方法来解决这个问题?
我猜很多人使用中央异常处理,并且有更好的解决方案吗?
提前感谢!
马蒂亚斯
编辑:我创建了一个示例,应该展示我需要的内容:基本上,我不想使我传递的整个操作变为可等待的,而是在Lambda中的一个调用:
当然,这样做会出现错误:
internal static void HandledAction(Action action, Info infoBar)
{
try
{
action();
}
catch (Exception ex)
{
infoBar.SetError("An Exception occured: " + ex.Message);
WriteLog(ex.StackTrace);
}
没有什么花里胡哨的,但它值得一试,因为更改错误处理非常容易。 但是,如果我想在Lambda中异步获取数据会发生什么?让我们看一个简单的例子:
private void mnuImportData_Click(object sender, RoutedEventArgs e)
{
ActionHelper.HandledAction(async () =>
{
throw new NotImplementedException("Ups");
}, infoMain);
}
当然,HandledAction得到调用并通过,因为它收到指针并抛出异常,但未被处理。
我想我必须创建一个AsyncHandledAction,并将该操作设置为异步执行,但是是否有更简单的方法来解决这个问题?
我猜很多人使用中央异常处理,并且有更好的解决方案吗?
提前感谢!
马蒂亚斯
编辑:我创建了一个示例,应该展示我需要的内容:基本上,我不想使我传递的整个操作变为可等待的,而是在Lambda中的一个调用:
ActionHelper.HandledActionAsync(() =>
{
//elided
CheckFileResult rslt = await excelImport.CheckFilesAsync(tmpPath);
//elided
}, infoMain);
当然,这样做会出现错误:
错误 3:'await' 操作符只能在异步 lambda 表达式中使用。请考虑使用 'async' 修饰符标记此 lambda 表达式。
async () => { }
可以匹配Action
和Func<Task>
两种类型。如果匹配到前者,就像有一个方法签名为async void F()
;后者则是async Task F()
。在你的情况下,你得到的是async void F()
,它具有“fire-and-forget”语义。 - Timothy Shields