线程终止时调用方法
我有一个表单启动一个线程。现在我希望表单在该线程终止时自动关闭。线程终止时调用方法
我到目前为止唯一找到的解决方案是在窗体中添加一个计时器,并检查线程是否在每个打勾处都处于活动状态。但我想知道是否有更好的方法来做到这一点?
目前我的代码看起来更不像这个
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
}
}
BackgroundWorker的类存在这种线程管理,以节省您不必推出自己的;它提供了一个RunWorkerCompleted事件,您可以只听。
编辑使其调用助手方法,使其更清洁。
thread = new Thread(() => { Synchronize(); OnWorkComplete(); });
...
private void OnWorkComplete()
{
Close();
}
如果上述方法有参数和多线程,这是行不通的。同步(param1)需要30秒,并且当它执行OnWorkComplete时,我在当前param1上有paramx,并且我得到错误结果:( – Sakthivel 2014-02-13 15:05:21
如果你看看BackgroundWorker,那么在Worker完成时会调用RunWorkerCompleted事件。
有关BackgroundWorkers Click Here
或者
你可以一旦完成调用一个功能齐全从Thread添加,并调用它的详细信息。
void Synchronize()
{
//DoWork();
//FinishedWork();
}
void FinishedWork()
{
if (InvokeRequired == true)
{
//Invoke
}
else
{
//Close
}
}
看一看代表,IAsyncResult的,的BeginInvoke和AsyncCallback的
在你的线程方法结束时,您可以使用invoke()方法(调用close(),因为大多数的WinForms方法应该被称为从UI线程):
public void Synchronize()
{
Invoke(new MethodInvoker(Close));
}
很好,谢谢 – RaYell 2009-07-22 09:46:59