我正在尝试从 C# 取消以 C++/CX 编写的操作。尽管我编写了两段代码,但在从 C# 端等待它时,我无法正确取消操作。这是一个例子:
从 C#:
var tcs = new CancellationTokenSource();
tcs.Cancel();
var class1 = new MyClass();
try
{
var asyncOp = await class1.DoSomeTaskAsync().AsTask(tcs.Token);
}
catch (OperationCanceledException oce)
{
//I want to get here
Handle(oce);
}
从 C++:
IAsyncOperation<bool>^ MyClass::DoSomeTaskAsync(){
return concurrency::create_async([](concurrency::cancellation_token ct) {
task<bool> my_task([]() {
doSomething1();
if (concurrency::is_task_cancellation_requested())
{
concurrency::cancel_current_task();
}
doSomething2();
return false;
}, ct);
return my_task;
});
}
问题似乎是在跨 ABI 调用任务时,将令牌传递到 AsTask 扩展方法中没有任何作用。在调试 C++ 端时, ct 和 is_task_cancellation_requested() 函数都表明尚未请求取消。