1

Я пишу небольшое приложение для отслеживания GPS на WP8.1, и я ударил немного о стену. Я могу создать задачу и делать все, что мне нужно, но я не могу ее отменить. В качестве эталона я использую этот answerWindows Phone 8.1 GPS фоновая задача

Это конструктор задачи, которые я пользователь (также пробовал с TaskFactory):

public async void run() 
{ 
    IProgress<object> progress = new Progress<object>(_ => track()); 
    //Above is needed to be able to update the UI component 
      Task.Run(async() => 
    //Need to run async because the task is a GPS position call that has a delay 
    { 
     while (true) 
     { 
      await Task.Delay(1000); 
      progress.Report(null); 
     } 
    }, tokenSource.Token); 
} 

Я создал объект tokenSource в секции основного класса в качестве публичной переменной иметь доступ к нему через метод stop_click stop (иначе у меня нет возможности использовать tokenSource.Cancel())

Когда я использую tokenSource.Cancel() внутри метода конструктора, все в порядке. Но когда я пытаюсь использовать его через Button_click так:

private void Button_Stop(object sender, RoutedEventArgs e) 
{ 
    tokenSource.Cancel(); 
} 

Ничего не происходит. У кого-нибудь есть какие-то решения?

Означает ли это, что если и использовать асинхров() каждый раз, когда он создает новый поток с новым маркером и с нажатием кнопки Methond Я отменяю оригинальные один из которых поток уже закрыт? Если да, то какие идеи об этом обойти?

ответ

0

Отмена в .Net является совместной. Вы отменяете его извне, и вам необходимо соблюдать отмену изнутри. Прямо сейчас вы подаете сигнал только на отмену.

Ваша задача должна проверить маркер каким-то образом и остановить задачу:

Task.Run(async() => 
{ 
    while (true) 
    { 
     tokenSource.Token.ThrowIfCancellationRequested(); 
     await Task.Delay(1000); 
     progress.Report(null); 
    } 
}, tokenSource.Token); 

Поскольку это именно то, как Task.Delay перегрузка, которая принимает CancellationToken осуществляется вы можете просто полагаться на него, чтобы бросить исключение:

Task.Run(async() => 
{ 
    while (true) 
    { 
     await Task.Delay(1000, tokenSource.Token); 
     progress.Report(null); 
    } 
}, tokenSource.Token); 
+0

Отлично! Работает как шарм. Большое спасибо за помощь! –

+0

Что делать, если я хотел бы поймать исключение, созданное для обработки некоторых других операций? –

+0

@JarekBrocki 'Task.Run' возвращает задание, которое вы можете ожидать. – i3arnon

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