2009-07-22 74 views
5

我有一个表单启动一个线程。现在我希望表单在该线程终止时自动关闭。线程终止时调用方法

我到目前为止唯一找到的解决方案是在窗体中添加一个计时器,并检查线程是否在每个打勾处都处于活动状态。但我想知道是否有更好的方法来做到这一点?

目前我的代码看起来更不像这个

partial class SyncForm : Form { 
    Thread tr; 

    public SyncForm() 
    { 
     InitializeComponent(); 
    } 

    void SyncForm_Load(object sender, EventArgs e) 
    { 
     thread = new Thread(new ThreadStart(Synchronize)); 
     thread.IsBackground = true; 
     thread.Start(); 
     threadTimer.Start(); 
    } 

    void threadTimer_Tick(object sender, EventArgs e) 
    { 
     if (!thread.IsAlive) 
     { 
      Close(); 
     } 
    } 

    void Synchronize() 
    { 
     // code here 
    } 
} 

回答

10

BackgroundWorker的类存在这种线程管理,以节省您不必推出自己的;它提供了一个RunWorkerCompleted事件,您可以只听。

+0

很好,谢谢 – RaYell 2009-07-22 09:46:59

6

编辑使其调用助手方法,使其更清洁。

thread = new Thread(() => { Synchronize(); OnWorkComplete(); }); 

... 

private void OnWorkComplete() 
{ 
    Close(); 
} 
+0

如果上述方法有参数和多线程,这是行不通的。同步(param1)需要30秒,并且当它执行OnWorkComplete时,我在当前param1上有paramx,并且我得到错误结果:( – Sakthivel 2014-02-13 15:05:21

6

如果你看看BackgroundWorker,那么在Worker完成时会调用RunWorkerCompleted事件。

有关BackgroundWorkers Click Here

或者

你可以一旦完成调用一个功能齐全从Thread添加,并调用它的详细信息。

void Synchronize() 
{ 
    //DoWork(); 
    //FinishedWork(); 
} 

void FinishedWork() 
{ 
if (InvokeRequired == true) 
    { 
    //Invoke 
    } 
else 
    { 
    //Close 
    } 
} 
1

看一看代表,IAsyncResult的,的BeginInvoke和AsyncCallback的

1

在你的线程方法结束时,您可以使用invoke()方法(调用close(),因为大多数的WinForms方法应该被称为从UI线程):

public void Synchronize() 
{ 
    Invoke(new MethodInvoker(Close)); 
}