2012-07-11 93 views
0

我有一個應用程序需要很長時間才能完成。我使用後臺工作來運行這些方法並保持我的UI響應。我的方法看起來像我應該將Backgroundworker傳遞給方法

public void DoSomething() 
{ 
    while(HaveMoreWork) 
    { 
    // do work 
    } 
} 

現在我想的UI能夠取消在任何時間,所以我改變了我的方法把一個BackgroundWorker,像這樣

public void DoSomething(Backgroundworker worker) 
{ 

    while(HaveMoreWork && !worker.CancelationPending) 
    { 
    // do work 
    } 
} 

我的問題是,是有更好的方法來做到這一點。看起來像傳遞BackgroundWoker作爲所有這些方法的參數有點混亂。對此最佳做法是什麼?

+1

他們必須知道工作者,無論是作爲參數還是全局變量。這看起來不錯。 – 2012-07-11 15:34:14

回答

0
public class DoSomethingService 
{ 
    private volatile bool _stopped = false; 

    public void Start(object socketQueueObject) 
    { 
     while (!_stopped) 
     { 
      ... 
     } 
    } 

    public void Stop() 
    { 
     _stopped = true; 
    } 
} 

... 

var doSomethingService = DoSomethingService(); 
doSomethingService.Start(); 
... 
doSomethingService.Stop(); 
1

我使用全局變量

private BackgroundWorker _bwSearch = new BackgroundWorker(); 

private void InitializeBackgroundWorker() 
{ 
    _bwSearch = new BackgroundWorker(); 
    _bwSearch.WorkerSupportsCancellation = true; 
    _bwSearch.DoWork += bwSearch_DoWork; 
    _bwSearch.RunWorkerCompleted += bwSearch_RunWorkerCompleted; 
} 

上停止按鈕點擊後

private void btnCancel_Click(object sender, EventArgs e) 
{ 
     _bwSearch.Abort(); 
} 

更新時間: 另外我使用的是繼承這個簡單的輔助類來自BackgroundWorker

public class AbortableBackgroundWorker : BackgroundWorker 
    { 
     private Thread _workerThread; 

     protected override void OnDoWork(DoWorkEventArgs e) 
     { 
      _workerThread = Thread.CurrentThread; 

      try 
      { 
       base.OnDoWork(e); 
      } 
      catch (ThreadAbortException) 
      { 
       e.Cancel = true; 

       Thread.ResetAbort(); 
      } 
     } 

     public void Abort() 
     { 
      if (_workerThread != null) 
      { 
       _workerThread.Abort(); 

       _workerThread = null; 
      } 
     } 
    } 
+0

BackgroundWorker使用線程池,這意味着您不應該在BackgroundWorker上調用中止。我相信一個更好的方法是將您的btnCancel_Click更改爲: if(_bwSearch.IsBusy)_bwSearch.CancelAsync(); – poco 2012-07-11 18:00:44