Можно ли отменить Task без CancellationToken?
Разбираюсь с отменой задач. С CancellationToken получилось сделать отмену, но с циклом, где в каждой итерации проверяю на отмену задачи. Теперь же не понимаю, как отменить ожидание одной большой задачи. Например, когда к нам от сервера приходит один большой Json.
Пример кода:
private async Task LoadDataExecute()
{
dialogService.Show("SuperView", OnCancelDialog);
//Как убрать ожидание в этой строчке, если в dialogService пользователь кликнул по отмене загрузки данных?
var models = await GetModelsAsync();
}
private void OnCancelDialog()
{
//Отменить загрузку данных
}
private async Task<IEnumerable<SuperModel>> GetModelsAsync()
{
await Task.Delay(10000);
//Что-то делаем
}
Ответы (1 шт):
Автор решения: Lapish
→ Ссылка
private CancellationTokenSource _tokenSource;
private async Task LoadDataExecute()
{
_tokenSource = new CancellationTokenSource();
dialogService.Show("SuperView", OnCancelDialog);
var models = await GetModelsAsync();
}
private void OnCancelDialog()
{
_tokenSource.Cancel();
}
private async Task<IEnumerable<int>> GetModelsAsync(CancellationToken token)
{
try
{
await Task.Delay(10000, token);
return Enumerable.Range(1, _rand.Next(5, 10));
}
catch(TaskCanceledException)
{
return null;
}
}
Спасибо EvgeniyZ