2014-11-16 3 views
0

В основном я запускаю программу, которая выполняет метод, который повторяется несколько раз (например, 7 раз), но мне нужна опция, чтобы отменить ТОЛЬКО запустить один из них, но все же разрешить новым Начало.CancellationTokenSource отменил более ожидаемый

Моя проблема заключается в том, что программа заканчивается, как только я нажимаю кнопку отмены. Так что я, кажется, что-то не хватает.

Главная:

for(int i = 0; i < 7; i++) 
{ 
    cts = new CancellationTokenSource(); 
    taskUbung = Task.Factory.StartNew(async() => 
    { 
     await doSomething(); 
    }, cts.Token); 
} 

Кнопка:

private void buttonSkipUbung_Click(object sender, RoutedEventArgs e) 
{ 
    cts.Cancel(); 
} 

Так что, если я нажав кнопку на 3-м раунде DoSomething(), остальные 4 никогда не будет выполняться. Что мне нужно изменить для моего желаемого поведения? Я мог бы просто использовать некоторые логические значения и вернуться в doSomething(), но я решил, что это будет более чистым и более отзывчивым, если это будет так.

+2

Я действительно не получаю ваш код. Если вы запускаете 7 асинхронных задач, они будут работать параллельно, то есть концепция всего. Таким образом, вы не можете отменить «текущий», потому что нет текущего, все они есть. – mcserep

+0

Разве это не ожидание? Подождите, пока doSomething() не будет выполнен, прежде чем запускать его второй раз? – Rattenmann

+0

Поскольку команда 'await' находится внутри асинхронной задачи, задача будет ждать чего-то, а не основного потока, который запустил задачу. Так что просто поставим, все 7 задач будут ждать завершения 'doSomething()' (какой код вы нам не показывали). – mcserep

ответ

0

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

Смежные вопросы