2011-09-29 28 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