2014-03-23 5 views
0

У меня возникло требование реализовать асинхронный длительный процесс. Я выполнил эту реализацию, используя Task.Run() все работало без каких-либо проблем. Однако это требование получило изменения, и теперь им нужна функция «отменить» любой текущей асинхронной задачи. если я объясню требование более простой формы; У меня есть кнопка, текстовое поле и список. , когда пользователь вводит что-то в текстовое поле и нажимает на кнопку, он должен извлекать данные из db и заполнять окно списка результатами db (предположим, что это длительный процесс) , если пользователь передумает и что-то снова введите в текстовом поле и нажмите кнопку, он должен остановить текущую текущую задачу, очистить окно списка и запустить задачу (выборку и отображение данных) с новыми значениями, введенными во второй попытке.Как остановить асинхронную задачу и запустить ее снова при аннулировании пользователя

Я попытался использовать токен отмены для этого, но не получил успеха. Буду признателен, если кто-нибудь поможет мне в этом.

+1

Какая проблема с токеном отмены? – Boklucius

+2

Пожалуйста, разместите свой код. Вы не получите никаких полезных ответов, если вы заставите всех угадать, что вы сделали неправильно. –

+1

Еще один вопрос «Я попробовал это, и это не сработало» на SO ... человек, эта тенденция заставляет меня отказаться от написания ответов. Как трудно это * отправить сообщение об ошибке и код, непосредственно связанный с проблемой *? Мы не можем читать ваши мысли, и мы не можем видеть ваш экран. Пожалуйста, будьте более внимательны. – NathanAldenSr

ответ

2

Использование CancellationToken не магически отменяет запущенную задачу. Код, выполняющийся внутри задачи, должен знать о токене и активно проверять его для отмены. Все методы, предоставленные вашей инфраструктурой, уже делают это, поэтому вы не можете быть использованы для этого. Тем не менее, это звучит, как вы написали свой собственный метод, который принимает CancellationToken наряду с этими линиями

public Task Method(CancellationToken ct) 
{ 
// do some database work here 
} 

В этом случае вы должны искать в библиотеке, которая используется для связи с базой данных, чтобы увидеть, если он поддерживает CancellationToken. Если да, то передайте его в библиотеку. Если этого не произойдет, то вы можете вручную проверить маркер после операции базы данных заканчивается, как этот

public Task<int> Method(CancellationToken ct) 
{ 
// do some database work here 
ct.ThrowIfCancelled(); 
// return DB result here 
} 

При таком подходе не будет отмены запроса DB, но, по крайней мере, не будет возвращать результаты, и код, вызывающий запрос, сможет обрабатывать отмену.

Если вы используете библиотеку, такую ​​как EntityFramework, то вы сможете предоставить CancellationToken для некоторых запросов и, таким образом, потенциально сохранить базу данных из-за потери работы, а также сразу же отменить задачу.

+0

nice я искал что-то вроде этого. Благодарю. –