我正在 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);
这意味着您需要通过 UITaskScheduler
(您可以通过致电获得TaskScheduler.FromCurrentSynchronizationContext()
当您在 UI 线程上时)使用此方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)