经过一些试验错误后,我找到了解决方案。
回答我自己的问题:
我是否有机会通知 WinRT 组件取消它的异步操作并且不尝试将控件返回给 JavaScript 回调?
是的,但不是直接的。
又怎样?
- 在 WinRT、C# 组件端,
CancellationTokenSource
在 C# WinRT 组件中设计一个属性,并在调用异步操作之前将其分配。
- 创建一个实例
CancellationTokenSource
并将其设置为在调用异步操作之前在上一步中创建的属性。
ContinueWith
在将 .NET 任务转换为 WinRT 之前流畅地继续使用异步操作方法,IAsyncOperation<T>
并将CancellationToken
创建的作为先前实例化的一部分提供CancellationTokenSource
给该ContinueWith
方法(请参阅取消任务:http: //msdn.microsoft.com/en-us/library /dd997396.aspx)。
- 在 WinRT 组件中实现一个
CancelCurrentAsyncOperation
方法,该方法将调用CancellationTokenSource.Cancel()
.
- 在导航到另一个页面之前调用 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();
这对我有用!