2012-12-12 53 views
0

我有背景工作者。當它啓動時,它會調用一個方法將數據庫中的記錄發送到另一個webservice。如何停止由Backgroundworker調用的方法?

問題是我做了一個停止按鈕來停止作業發送,但它沒有工作。

我嘗試處理backgroundworker或CancelAsync,但該方法仍在運行(我的應用程序是一個Windows窗體應用程序,所以我知道該方法仍在運行)。任何人都可以爲我提供解決方案嗎?太多了!

我的代碼:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      Send(); 
     } 

停止按鈕

private void btnStop_Click(object sender, EventArgs e) 
     {    
      try 
      { 
       backgroundWorker1.CancelAsync(); 
       backgroundWorker1.Dispose();         
      } 
      catch (Exception ex) 
      { 
       Global._logger.Info(ex.Message + ex.Source); 
       ShowError(ex.Message); 
      } 

     } 

注:send()方法將調用另一個方法檢查DB後,發送記錄。

+2

我跑與運行無限循環相同的問題。我最終做的是創建一個volatile標誌,並在我想讓所有線程停止時改變它的值。這導致循環退出並且線程自行退出。 –

+0

@Steve:是的,tks我只是想到了:)我回答了我自己的問題:) –

+0

這是一個非常重複的問題。一個這樣的[Cancel backgroundworker](http://stackoverflow.com/questions/3255459/cancel-backgroundworker)。在發佈之前總是做一個基本的SO搜索 – nawfal

回答

0

好吧,我發現它:)我不需要做任何事BackgroundWorker的處理只是它和方法創建一個全局變量作爲標誌,以終端的循環,send()方法調用

1

這一切都取決於Send正在做什麼。您需要將BackgroundWorker實例傳遞到此方法並檢查CancellationPending屬性(調用CancelAync後設置)。如果Send正在使用某種異步帖子或者甚至是批量的帖子,您將無法取消它。你必須能夠在某個時候檢查這個屬性來阻止你正在做的事情。

0
if(worker.IsBusy) 
{ 
    worker.CancelAsync(); 
} 
else 
{ 
    worker.RunWorkerAsync(); 
} 
相關問題