Можно ли отменить 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

→ Ссылка