2011-03-23 93 views
2

搜索我寫在C#這需要搜索條件從用戶代碼和數據庫表搜索,如果我想強制停止線程我做到了這一點與現在同時執行後臺工作 的幫助。 因爲如果用戶得到的結果,他不想再被執行搜索停止的BackgroundWorker這是在數據庫

btnStop_Click(object sender, EventArgs e) 
{ 
      backgroundWorkerSearch.CancelAsync(); 
} 

on dowork() 
if (backgroundWorkerSearch.CancellationPending) 
{ 
    e.Cancel = true; 
    return; 
} 

上面的代碼不起作用

+4

界定「不工作」 ......和在什麼時候'如果(backgroundWorkerSearch.CancellationPending)'執行相對於工人的代碼的其餘部分?例如,這通常被用作循環的一部分。 – 2011-03-23 06:53:45

+0

'不起作用'的意思,雖然我點擊停止按鈕操作不會停止。 – sk7 2011-03-23 10:00:55

回答

4

取消掛起並只告訴起始線程想要的它中止DoWork的方法。它不會自動停止任何事情。看到的DoWork方法的這個例子:

private void DoWork(object sender, DoWorkEventArgs e){ 
    foreach(...) 
    { 
    //do some work 
    if(myBackgroundWorker.CancellationPending) 
    { 
     return; 
    } 
    } 
} 

另一種可能性(你的情況是這樣的)

private void DoWork(object sender, DoWorkEventArgs e){ 
    //perform a big task towards the database here 
} 

這最後一種情況不給你任何切入點,以檢查取消請求,所以ony選項是找到線程並殺死它,但沒有讓它有機會以良好的方式關閉,並且不是推薦的模式。

最好的辦法是分幾批內DoWork的工作,並檢查每個子任務之間取消請求。