3

我正在使用 Windows 8(使用 C#),当使用async关键字时,有一种情况我似乎无法很好地处理异常。

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

示例:这段代码在某个工作线程上执行,并尝试在 UI 线程上安排工作:

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

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

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

这可能吗?

4

1 回答 1

2

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

如果你真的需要这个,你可以使用Task.Factory.StartNew()允许你指定 a的重载TaskSchedulerUnwrap()并将结果更改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(您可以通过TaskScheduler.FromCurrentSynchronizationContext()在 UI 线程上调用来获得)传递给此方法。

于 2013-04-26T09:57:13.057 回答