2015-10-07 2 views
0

Я пытаюсь разработать приложение WPF, которое запускает другой процесс в фоновом режиме при нажатии кнопки (и останавливает его, когда одна и та же кнопка снова нажата).Запуск/остановка фоновой функции

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

Я попытался с Threads, но когда я создаю новый объект потока, когда я нажимаю кнопку, я не могу получить к нему доступ, когда я нажимаю его снова, потому что есть разные кодовые блоки.

Я поехал, что лучший способ сделать это - использовать BackgroundWorker, но я не понимаю, как его использовать.

Это код, который у меня есть прямо сейчас. mon является созданным объектом, который имеет функцию, что я хочу работать в фоновом режиме (mon.MonitoriceDirectory)

if (this.monitoring) 
{ 
    var dialog = new System.Windows.Forms.FolderBrowserDialog(); 
    dialog.ShowNewFolderButton = false; 
    System.Windows.Forms.DialogResult result = dialog.ShowDialog(); 
    if (dialog.SelectedPath != "") 
    { 
     monitorizeButton.Content = "Stop"; 
     textBlockMonitorize.Text = "Monitoring..."; 
     this.monitorizando = false; 
     mon.monitorizePath = dialog.SelectedPath; 
     Thread newThread = new Thread(mon.MonitorizeDirectory); 
     newThread.Start(); 
    } 
} 
else 
{ 
    newThread.Abort(); // Here is the problem, I can't access to that cuz 
         // it's in another codeblock. 
    monitorizeButton.Content = "Monitorice"; 
    textBlockMonitorize.Text = "Ready"; 
    this.monitorizando = true; 
} 
+3

Вы ответили на собственный вопрос. Задайте значение вне метода (внутри класса). – kevintjuh93

+0

Вы посмотрели на аннулирование задачи с помощью параллельной библиотеки задач? Это текущий золотой стандарт для отмены асинхронной работы https://msdn.microsoft.com/en-us/library/dd997396%28v=vs.110%29.aspx – Gusdor

+0

@Polyfun Теперь лучше? Программа на испанском языке, поэтому извините меня 4 моего английского. –

ответ

0

Объявив newThread из СТОРОНА if блока поможет вам расширить простор для else части также; поэтому вы можете попробовать это,

Thread newThread; 
    if (this.monitorizing) 
    { 
    var dialog = new System.Windows.Forms.FolderBrowserDialog(); 
    //rest of code here 
    newThread = new Thread(mon.MonitorizeDirectory); 
    //Rest of code 
    } 
else 
    { 
    newThread.Abort(); 
    //Rest of code here 
    } 
+0

Как это работает? Что он достиг? Будет ли это работать в обработчике событий? – Gusdor

+1

Должен быть объявлен вне метода, иначе он все равно ничего не сделает. Фактически это даст NPE здесь. – kevintjuh93

+0

Кажется, что работает, спасибо! –

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