2011-09-29 54 views
0

我有一個簡單的函數,用一個模態窗體啓動一個線程,然後等待窗體關閉。Threadreference.isalive = true,但是在線程窗口中它的位置是[在睡眠中,等待或加入]

private static bool GetSomeText() 
    { 
     Thread threadx = new Thread(GetSomeTextx); 

     threadx.SetApartmentState(ApartmentState.STA); 
     threadx.Start(); 

     int i = 0; 
     const int secs = 6000; 
     while (threadx.IsAlive && i < secs) 
     { 
      Thread.Sleep(1000); 
      i++; 
     } 

     if (i >= secs) //timeout 
     { 
      try 
      { 
       threadx.Abort(); 
      } 
      catch { } 

      MessageBox.Show("Timeout etc."); 
      return false; 
     } 
     else 
     { 
      return CheckText(Constants.inputedtext); 
     } 
    } 

    private static void GetSomeTextx() 
    { 
     WindowWrapper window = new WindowWrapper(Fun.GetForegroundWindow()); 
     FormGetSomeText epa = new FormGetSomeText { displaytext=Constants.displaytext}; 
     epa.ShowDialog(window); 
     Constants.inputedtext= epa.inputedtext; 
    } 

的問題是,關閉線程退出GetSomeTextx(),但仍然在冷宮窗口... 之後之後,如果我把休息中「,而(threadx.IsAlive & &我<秒) 「我看到threadx.IsAlive是真實的,在調試窗口中,有問題的線程位置是:[在睡眠中,等待或加入],如果我執行右鍵單擊 - >切換到線程,則顯示」無源可用「並單擊在顯示反彙編中顯示「沒有可用的反彙編」。

此代碼幾乎是1:1個複製(在另外一個有2個文本框,而不是1)另一種情況的,我必須得值這樣的,它能夠正常工作......

有什麼事情它是?

POSTDATA:在GetSomeTextx的無果結束試了已經加入Thread.CurrentThread.Abort ...

+0

打開非託管調試並啓用Microsoft符號服務器。發佈你現在得到的堆棧跟蹤,如果你不知道。 –

回答

1

等待線程來完成的,撥打Join

private static bool GetSomeText() 
{ 
    Thread threadx = new Thread(GetSomeTextx); 

    threadx.SetApartmentState(ApartmentState.STA); 
    threadx.Start(); 

    // Wait for thread to exit 
    threadx.Join(); 

如果你想在超時時支持報告,請撥打Join重載,讓您指定超時值。

+0

具有諷刺意味的是,在詢問問題後,我嘗試了這種方法,但是我希望知道爲什麼一個工作(如果有問題)的方式停止這樣做...... – VSP