2012-05-18 138 views
2

我目前正试图在测试软件上实现自动保存功能。等待线程完成而不阻止UI线程

“开始”按钮触发TestThread进行测试。 UI通过TestThread的Invokes进行更新,为测试人员提供有关测试的实时信息。当用户点击“停止”按钮时,会设置一个标志,通知TestThread完成当前测试并停止。它还禁用UI上的控件并触发StopThread来监视TestThread的进度。当TestThread完成时,StopThread重新启用UI控件。

此时,我需要等待StopThread完成,才能调用自动保存(导致Excel文件生成的SaveFileDialog)。但是,在“停止”按钮中使用StopThread.Join()单击处理程序似乎只会导致程序挂起。这可能是因为TestThread需要时间来完成并尝试更新被阻止的UI线程。

从StopThread调用保存函数会生成一个ThreadStateException,因为我使用SaveFileDialog(模式窗体),并且显然要求将调用线程设置为“单线程公寓”。

对此的搜索似乎指向简单使用Thread.Join()的一般答案。一个简单的事实,我需要保持UI活动,直到线程完成使这无法使用。有没有一种方法可以从StopThread调用SaveFileDialog,但将它编组到UI线程?还有其他建议吗?提前致谢。

工作液:

private void btn_Stop_Click(object sender, EventArgs e) 
    { 
     //Disable UI controls and flag test ending 

     Thread StopThread = new Thread(WaitForTestEnd); 
     StopThread.Start();   
    } 

    private void WaitForTestEnd() 
    { 
     while (!testStopped) //Flag set at end of TestThread 
     { 
      Thread.Sleep(50); 
     } 

     //Re-enable UI 

     AutoSave saveMyData = SaveData; 
     Invoke(saveMyData); 
    } 

    private delegate void AutoSave(); 

    private void SaveData() 
    { 
     //Generate SaveFileDialog and save. 
    } 

回答

3

StopThread不要挡住的。相反,安排StopThread表示它已完成的主线程。例如通过使用Invoke

+0

啊,我真的需要习惯多线程。感谢您指点我正确的方向。更新我的问题与我如何实施此解决方案。 – Bandoth

1

有没有一种方法可以从StopThread中调用SaveFileDialog,但将它编组到UI线程?

你为什么不只是使用Control.InvokeDispatcher.Invoke,在正是这听起来好像你是TestThread以同样的方式?