2012-03-27 92 views
1

我有一個Windows窗體。點擊「確定」後,將完成一些需要一些時間的工作。在此過程中,表單的所有控件都被禁用,因此用戶無法執行某些操作。除了一個按鈕,中止。該按鈕仍可用於中止處理任務。 我開始一個新的主題,很好。問題是,當單擊ob中止時,在線程完成後調用該事件。C#窗體窗體線程:我的窗體似乎不作爲自己的線程運行

繼承人,他的代碼來啓動線程(我buttonOk_Click Eventmethod內)(我使用的優先級假裝的,而我做一些數據庫操作beeing中止的線程):

t1 = new System.Threading.Thread(processing); 
t1.Priority = System.Threading.ThreadPriority.Normal; 
t1.Start(); 

繼承人的代碼,其中我抓住了中止事件,但在線程正在工作期間沒有被訪問。 (Withing ButtonAbort_Click-Method)

while (t1.Priority == System.Threading.ThreadPriority.Highest) 
{ 
    System.Threading.Thread.Sleep(1000); 
} 
try 
{ 
    lock (t1) 
    { 
     if (t1.ThreadState != System.Threading.ThreadState.Aborted) 
     { 
      //abort Thread 
      t1.Abort(); 
      //wait that lock is not released to early 
      while (t1.ThreadState != System.Threading.ThreadState.Aborted) { } 
     } 
    } 
} 

希望你能幫助我。謝謝。

+2

這是你在那裏的一些非常奇怪的代碼。什麼是優先檢查? – Tudor 2012-03-27 09:32:58

+0

不要做thread.abort()它會搞砸了。使用一個標誌並在線程中檢查這個標誌,讓它自行停止。 – RvdK 2012-03-27 10:21:48

回答

1

ButtonAbort_Click事件處理程序在圈子tieing了UI線程轉圈。這就是爲什麼你的表格「似乎不能作爲自己的線程運行」。您需要做的是讓您的processing方法週期性地輪詢信號以正常終止。中止線程不是一個好主意。這是你的代碼應該看起來像什麼。

class YourForm : Form 
{ 
    private ManualResetEvent terminate = new ManualResetEvent(false); 

    private void YourThread() 
    { 
    while (!terminate.WaitOne(0)) 
    { 
     // Do some more work here. 
    } 
    } 

    private void ButtonAbort_Click(object sender, EventArgs args) 
    { 
    terminate.Set(); 
    } 
} 

注意,線程在每次循環調用ManualResetEvent.WaitOne測試,看看是否終止信號設置。