C++/CX で記述された操作を C# からキャンセルしようとしています。両方のコードを書いたにもかかわらず、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;
});
}
問題は、トークンを AsTask 拡張メソッドに渡すと、ABI を介してタスクを呼び出すときに何も行われないことです。C++ 側をデバッグすると、ct と is_task_cancellation_requested() 関数の両方がキャンセルが要求されていないことを示します。