我在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()
来获得)传递给这个方法。