2015-09-03 4 views
1

Я прочитал несколько статей об этом, но в настоящее время я не знаю. Я работаю над приложением, где есть TabControl, расположенный в форме. Когда пользователь нажимает на вкладку, я хотел бы, чтобы фоновый процесс работал с потоком пользовательского интерфейса (так как процесс может занять несколько минут). Это прекрасно, однако, если пользователь выбирает другую вкладку, мне бы хотелось, чтобы какая-либо текущая активная задача была отменена, а также внимание к новой вкладке. неОтмена и перезапуск задачи

private void ParentTabControl_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Task testTask; 
     CancellationTokenSource testSource = new CancellationTokenSource(); 
     CancellationToken testToken = testSource.Token; 

     switch (ParentTabControl.SelectedIndex) 
     { 
      case 0: 
       updateSummaryTab(); 
       break; 
      case 1: 
       testTask = Task.Run(() => 
        { 
         updateTabOne(); 
        }, testToken); 
       break; 
      case 2: 
       updateTabTwo(); 
       break; 
     } 
    } 

Если я устанавливаю testSource отменить, то это будет уже не по годным к употреблению (хотя я знаю, что мне нужно будет использовать маркер какого-то). Раньше я использовал другую BackgroundWorker для каждой вкладки и просто проверял ее свойство IsBusy, но я думал, что использование одной переработанной задачи может быть лучшим вариантом.

+0

Какая конкретная проблема у вас есть? Похоже, все, что вам нужно сделать, это отменить любую выдающуюся работу при включении вкладок и начать новую работу. – usr

+0

Проблема заключается в том, что когда я отменю задачу с помощью CancellationToken, новая задача не запускается (предположительно потому, что она использует тот же токен, который теперь установлен как отмененный) –

ответ

1

Проблема, которую я получаю, когда я отменить задание с помощью CancellationToken, новая задача не запустилась

Создать свежий CTS (и КТ) для каждого раунда работы, что вы начинаете. Вам нужно сохранить CTS для последнего раунда в поле. Затем, начиная новую работу является:

if(cts != null) cts.Cancel(); 
cts = new ...; 
StartWork(cts.Token); 

Имейте в виду, что отмена запущенных задач является кооперативным и передавая маркер Task.Run ничего не делает, потому что это не остановит уже запущенное задание.

+0

У меня было ощущение, что мне придется перерабатывать CancellationTokenSource , Я просто не мог понять, как это сделать. Если передача Token в Task не отменяет его при запуске Task (но с использованием cts.Cancel()), будет ли какая-либо точка использования Token? –

+0

Вам нужно передать токен в «StartWork» и использовать его там. Опросите его или передайте его методам ввода-вывода. – usr

+0

Ах, кажется, что выполнение задач не может быть отменено. Вы бы посоветовали мне вернуться к использованию BackgroundWorker в этом случае? –

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