2015-10-07 170 views
0

我試圖開發一個WPF應用程序,當按下按鈕時(並在同一按鈕再次按下時停止它)在後臺運行其他進程。啓動/停止後臺功能

嗯,這裏的重點是我稱之爲監視文件夾的過程,因此,它不會在任何時候結束。

我嘗試了線程,但是當我按下按鈕時創建一個新的線程對象時,由於存在不同的代碼塊,我再次按下它時無法訪問它。

我認爲更好的方法是使用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現在好點?該程序是西班牙語,所以請原諒我的英語。 –

回答

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

看來是有用的,謝謝! –