捕获async lambda异常



我在Windows 8上工作(使用c#),当使用async关键字时,有一个场景,我似乎不能很好地处理异常。

该场景涉及启动async lambda,并将其发布到UI线程上运行。
在执行lambda代码期间发生的异常会在调用线程上被重新抛出,而无法正确捕获它们。

示例:这段代码在一些工作线程上执行,并尝试在UI线程上调度工作:

await Window.Current.Dispatcher.RunAsync
        (CoreDispatcherPriority.Normal
         , async () =>
             {
               var result = await CurrentAppSimulator
                                  .RequestProductPurchaseAsync("product, true);
             }
        );

如果lambda表达式内部的代码抛出异常,则该异常不会被重新发布回此方法的主体。相反,它是由SynchronizationContext或一些类似的机制抛出的,而我似乎无法捕获它。

我想要的是从这个代码体(调用代码)捕获异常的能力。

这可能吗?

我认为如果可能的话,你不应该这样做。UI线程应该是管理后台线程上发生的事情的线程,而不是相反。

如果您确实需要这个,您可以使用Task.Factory.StartNew()的过载,它允许您指定TaskScheduler,以及Unwrap()将结果Task<Task>更改为简单的Task:

await Task.Factory.StartNew(
    async () =>
        await CurrentAppSimulator.RequestProductPurchaseAsync("product", true),
    CancellationToken.None, TaskCreationOptions.None, scheduler)
    .Unwrap();
或者,您可以使用await await:
await await Task.Factory.StartNew(
    async () =>
        await CurrentAppSimulator.RequestProductPurchaseAsync("product", true),
    CancellationToken.None, TaskCreationOptions.None, scheduler);

这意味着你需要将UI TaskScheduler(当你在UI线程上时你可以通过调用TaskScheduler.FromCurrentSynchronizationContext()来获得)传递给这个方法。

最新更新