Применить 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.