怎么解决主窗体线程关闭时子线程却还在执行任务这个问题
private void toolStripButtonConnect_Click(object sender, EventArgs e)
{
//...
timerForDB = new System.Threading.Timer(OnDisplay, null, 0, 3000);
//...
}
void OnDisplay(object obj)
{
LedDisplay(m_Result[counter][0], m_Result[counter][1]);
Application.DoEvents();
if (counter == m_Result.Count - 1)
{
counter = 0;
}
else
{
counter++;
}
}
public void LedDisplay(string PlateNumber, string strStatus)
{
string bmpfile = string.Format("{0}\\ledplate.bmp", BinDirectory);
//...用于生成不同内容的bmpfile
LedShow(bmpfile, "192.168.1.176");
}
[DllImport("LedShow.dll", EntryPoint = "LedShow")]
private static extern void LedShow(string lp_bmppath, string lp_ipAddr);
在关闭主窗体时就会出现错误
我的理解就是关闭的时候子线程还在执行任务并且需要MainForm,而实际上这时候主线程已经释放掉了,所以就出现了截图中的错误.曾经尝试过在OnDisplay方法中做一个判断,if(this.Handle != null) LedDisplay(m_Result[counter][0], m_Result[counter][1]);但是这根本不管用,还是报一样的错误.希望大家帮帮忙,看看怎么解决这个问题比较好. --------------------编程问答-------------------- form closing 的时候判断一下子线程时候还在运行, 运行就abort()一下. --------------------编程问答-------------------- 关闭主线程的时候,kill掉一切有关线程。 --------------------编程问答-------------------- 或者把你的子窗线开始运行前面就设为后台线程 --------------------编程问答-------------------- IsBackground属性设为true --------------------编程问答-------------------- #1 我也在OnDisplay方法里获得线程并且在formClosing时Abort,结果还是一样报错,是不是我获得的不是那个线程?我不得而知了
#4 这个也尝试过了,并不能解决问题/ --------------------编程问答-------------------- 解决方法很多
主要问题是子线程要更新主线程窗体,所以提示找不到主窗体的句柄
所以就是要子窗体,更新主窗体的时候加个判断
主窗体都不在了,子线程对于你的程序来说也每啥作用了,最好的方法,当然是不要留着子线程 --------------------编程问答-------------------- System.Environment.Exit(System.Environment.ExitCode); --------------------编程问答-------------------- 设置为后台线程吧 :IsBackground=true --------------------编程问答-------------------- 使用.net封装的类库机制,尽量不要使用 win api。那样就不会纠结这些东西。 --------------------编程问答-------------------- --------------------编程问答-------------------- 关闭的时候停掉timer,调用SDK之前判断窗口IsDisposed状态,加锁 --------------------编程问答-------------------- 我记得WinForm有个OnClose事件可以善后 --------------------编程问答-------------------- 设置为后台线程吧 :IsBackground=true
补充:.NET技术 , C#