1
我試圖取消從C#編寫的C++/CX中的操作。儘管我寫了兩段代碼,但在從C#端等待它時無法正確取消操作。這裏有一個例子:如何從C#中取消C++/CX中的異步操作
從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()函數都指示未請求取消。
啓動異步操作後調用'txw.Cancel'。如果任務已被取消,請確保您的操作足以取消並多次詢問。 – kiewic
我不知道爲什麼這是一個要求取消任務_after_它已經開始。如果您導航到頁面的情況如何,頁面會啓動一系列任務,然後啓動一些任務,然後您可以快速離開頁面。可能有一些任務尚未開始,您希望立即取消,對吧? – Kellen
所以,你可以添加一個布爾值來表示你已經決定去別的地方,所以你不會開始任何其他的異步操作。我的**猜測**是,只有在調用「取消」之前生成的令牌將被取消。所以,如果你在調用'Cancel'之後啓動一個鏈接的異步操作,只要在調用'Cancel'之前生成了該標記,它就會被取消。 – kiewic