当前位置:编程学习 > C#/ASP.NET >>

怎么解决主窗体线程关闭时子线程却还在执行任务这个问题


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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,