一些背景
在过去的几天里,我一直在开发一些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();
这对我有效!
总结以上是内存溢出为你收集整理的WinRT,Javascript和随机的“拒绝访问”exception全部内容,希望文章能够帮你解决WinRT,Javascript和随机的“拒绝访问”exception所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)