Применить CancellationToken в блоке данных

В моей заявке производителя-потребителя. У меня есть:

CancellationTokenSource cTokenSource = new CancellationTokenSource();
CancellationToken cToken = new CancellationToken();
cToken = cTokenSource.Token;

Нажмите кнопку "Пуск", приложение запущено.

private async void Start_Click(object sender, RoutedEventArgs e)
{ var producer = Producer(); var consumer = Consumer(); await Task.WhenAll(producer, consumer);
}

У потребителя я использовал TPL.

async Task Consumer()
{ try { var executionDataflowBlockOptions = new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50, CancellationToken = cToken }; var consumerBlock = new ActionBlock<appointmentreminder>( remainder => { // blah blah for long running processes and updating UI var result = Run(reminder); }, executionDataflowBlockOptions); bufferBlock.LinkTo( consumerBlock, new DataflowLinkOptions { PropagateCompletion = true }); await Task.Delay(500); }
</appointmentreminder>

Теперь у меня есть кнопка отмены, я хочу остановить пользовательские задачи TPL, пока я нажимаю на нее. Как?

private void Cancel_Click(object sender, RoutedEventArgs e)
{
1 ответ

Отмена в.Net является совместной. Вы создаете источник CancellationTokenSource для обработки отмены и используете CancellationToken для уведомления об отмене. Чтобы отменить токен, просто позвоните в CancellationTokenSource.Cancel:

cTokenSource.Cancel();

Кстати, нет никакого смысла в создании CancellationToken напрямую, поскольку он никогда не может быть отменен. Вы должны получить токен от CancellationTokenSource:

var cTokenSource = new CancellationTokenSource();
var cToken = cTokenSource.Token;

licensed under cc by-sa 3.0 with attribution.