2012-07-11 155 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

相关问题