Я новичок в приложении UWP на C#. Мне нужно отменить задачу, когда происходит блокирующий вызов. Пожалуйста, обратитесь к приведенному ниже фрагменту кода для лучшего понимания.
TimeSpan timeSpan = TimeSpan.FromMilliseconds(10000);
CancellationToken token = new CancellationTokenSource(timeSpan).Token;
await Task.Run(() =>
{
//This is a blocking call
Task.Delay(11002).Wait();
}, token);
Насколько я знаю, если я выполняю блокирующий вызов, например Task.Delay(11002).Wait(token);, тогда задача Delay отменяется, но мое требование - отменить родительскую задачу. Потому что я должен делать запись в задаче сокета синхронизации.
Надеюсь, моя проблема всем понятна. Спасибо
token.Cancel ();





Я бы рекомендовал создать источник токена отмены вне метода, который вы собираетесь использовать, и передать его, как упомянул Нил в своем комментарии.
Вот пример, показывающий, как это можно сделать и как отменить.
private async Task ParentAsync()
{
TimeSpan timeSpan = TimeSpan.FromMilliseconds(10000);
CancellationTokenSource cts = new CancellationTokenSource(timeSpan);
await ExecuteAsync(cts);
cts.Cancel(); // This will cause the execution to cancel.
}
private async Task ExecuteAsync(CancellationTokenSource cts)
{
await Task.Run(() =>
{
//This is a blocking call
Task.Delay(11002).Wait();
}, cts.Token);
}
Если вы хотите отменить выполнение родительского метода, выполните те же действия, которые вы уже сделали для дочернего метода, используя токен для обработки отмены Задачи.
Надеюсь это поможет!
Нет никакой «родительской задачи». Вы создаете новую задачу, которая отменяется. Если вам нужно отменить другую задачу, тогда этой задаче необходимо передать CancellationToken И использовать для блокировки вызовов.