在过去的几天里,我一直在开发一些Windows 8 HTML5 / WinJS应用程序。此应用程序使用WinRT组件完成一些工作。
JavaScript部分与整个WinRT组件协作启动异步操作:回调函数由JavaScript提供,WinRT在有异步结果时调用它。
我忘了提到整个Windows 8应用程序不是使用单页方法开发的。
如果在某个页面中调用了整个异步操作而您没有导航到其他页面,那么一切都按预期工作。
但是,导航到其他页面时会发生什么?当WinRT组件需要通知JavaScript部分有关异步操作的结果时:访问拒绝异常!你的应用程序崩溃了。
IAsyncOperation<T>
:在导航到其他页面之前,我在JavaScript中调用.cancel()
方法=&gt; 没有运气 WinJS.Application.sessionState
,以确保整个函数不被垃圾收集器=&gt;销毁。 没有运气 我有没有机会通知WinRT组件取消它的异步操作,不要尝试将控件返回到JavaScript回调?
提前致谢
您可以检查其他人之前是否发现了同样的问题:
答案 0 :(得分:2)
我在一些试错后找到了解决方案。
回答我自己的问题:
我是否有机会通知WinRT组件取消它 asynhcronous操作,不要试图将控件返回到 JavaScript回调?
是的,但不是直接。
那么,怎么样?
CancellationTokenSource
属性,并在调用异步操作之前分配它。CancellationTokenSource
的实例,并在调用异步操作之前将其设置为上一步中创建的属性。ContinueWith
之前,流畅地继续使用IAsyncOperation<T>
方法进行异步操作,并将CancellationToken
作为先前实例化CancellationTokenSource
的一部分创建使用ContinueWith
方法(请参阅取消任务:http://msdn.microsoft.com/en-us/library/dd997396.aspx)。CancelCurrentAsyncOperation
方法,该方法将调用CancellationTokenSource.Cancel()
。CancelCurrentAsyncOperation
方法。public sealed class MyWinRTComponent
{
private CancellationTokenSource { get; set; }
public void CancelLastAsyncOperation()
{
if(CancellationTokenSource != null)
{
CancellationTokenSource.Cancel();
}
}
public IAsyncOperation<string> DoSomethingAsync()
{
CancellationTokenSource = new CancellationTokenSource();
return DoSomethingAsync()
.ContinueWith<string>(task => task.Result, CancellationTokenSource);
}
}
var component = new MyWinRTComponent();
component.doSomethingAsync().then(function(text) {
// Do stuff
});
// Before navigating to other page
component.cancelCurrentAsyncOperation();
这对我有用!!