一些背景
在过去的几天里,我一直在开发一些Windows 8的HTML5 / Winjs应用程序。 这个应用程序使用WinRT组件做了一些工作。
JavaScript部分与整个WinRT组件开始一个asynchronous操作:callback函数由JavaScript给出,WinRT在有一些asynchronous结果时调用它。
我忘了提及整个Windows 8应用程序不是使用单页面方法开发的。
问题
如果在某个页面中调用了整个asynchronous操作,并且您没有导航到其他页面,则一切正常。
获取.NET枚举的Windows本地化
用多个视图构buildC#.NET窗口应用程序
用C#下载文件
在Windows中枚举特定types的文件
在.Net CLI应用程序中显示完成百分比的最佳方法是什么?
但是, 当您导航到其他页面时会发生什么? 当WinRT组件需要通知JavaScript部分有关asynchronous操作的结果时: ACCESS DENIED EXCEPTION ! 而你的应用程序崩溃。
到目前为止,我已经尝试过
整个WinRT组件方法返回一个IAsyncoperation<T> :在导航到其他页面之前,我调用JavaScript中的.cancel()方法=> .cancel()
我已经把callback函数放入Winjs.Application.sessionState中,以确保整个函数不被垃圾收集器破坏=> NO LUCK
这个问题…
我有没有机会通知WinRT组件取消它的asynchronous操作,并且不要试图将控件返回给JavaScriptcallback?
提前致谢
您可以检查其他人之前是否find相同的问题:
http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/5f9ebfe6-d652-442d-850d-41bda5e370c9
如何为Windows窗体应用程序创build安装程序和卸载程序
如何在使用luna或classic时删除WPF窗口的边框?
使用多个对象遍历foreach循环
Powershell:pipe道input到通过调用运算符执行的命令
应用程序崩溃作为有限的用户
我发现一些试错后的解决方案。
回答我自己的问题:
我有没有机会通知WinRT组件取消它的异步操作,并且不要试图将控件返回给JavaScript回调?
是的,但不是直接的 。
又怎样?
在WinRT中,C#组件端,在C#WinRT组件中设计CancellationTokenSource属性,并在调用异步操作之前分配它。
创建一个CancellationTokenSource实例,并在调用异步操作之前将其设置为在上一步中创建的属性。
在将.NET任务转换为WinRT IAsyncoperation<T>之前,用ContinueWith方法ContinueWith执行异步操作,并将CancellationToken作为以前实例化的CancellationTokenSource一部分创建为ContinueWith方法(请参阅取消任务: http : //msdn.microsoft .com / en-us / library / dd997396.aspx )。
在调用CancellationTokenSource.Cancel()的WinRT组件中实现CancelCurrentAsyncoperation方法。
在导航到另一个页面之前,先调用Winjs / JavaScript中的CancelCurrentAsyncoperation方法。
WinRT组件示例代码:
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); } }
JavaScript示例代码:
var component = new MyWinRTComponent(); component.doSomethingAsync().then(function(text) { // Do stuff }); // Before navigating to other page component.cancelCurrentAsyncoperation();
这对我有效!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。