C#中子窗口手动关闭之后,老是报句柄错误

bage1234455 2014-12-30 10:01:48
定时器为Timers.timer,设置延迟为200ms,我定时器中需要连接数据库并且要更新窗口,我手动关闭窗口会报错.
我在定时器里面开了个线程,声明线程名称全局变量,在formclosing里面写了t.abort() 但是还是出现了错误,现在的错误感觉跟定时器无关,而是和代码更新窗体有关,感觉定时器关了,这些代码并没有及时关闭.
...全文
295 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jaye-L 2015-01-06
  • 打赏
  • 举报
回复
t.IsBackground = true;
害羞的大叔 2015-01-06
  • 打赏
  • 举报
回复
退出代码不要用application.使用envirenment.exit(0)
江南小鱼 2014-12-30
  • 打赏
  • 举报
回复
1、formclosing事件,增加timer.Enabled=false 2、调用线程的Abort要加try catch,Abort本身是通过引发异常终止线程的。不建议通过Abort终止线程,可以设置bool类型的变量,当变量为true的时候,才执行相关线程操作,formclosing的时候,把bool变量置为false。 另外,调用Abort之后,线程未必立刻关闭,清理资源后线程才会关闭
bage1234455 2014-12-30
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
关闭时,timer未停止,访问量已关闭的窗体
啥意思
bdmh 2014-12-30
  • 打赏
  • 举报
回复
关闭时,timer未停止,访问量已关闭的窗体
bage1234455 2014-12-30
  • 打赏
  • 举报
回复
引用 15 楼 lovelj2012 的回复:
[quote=引用 12 楼 u010774311 的回复:] [quote=引用 11 楼 u010774311 的回复:]
引用 11 楼 u010774311 的回复:
现在不用委托他们都不报错。。。[/quote] 你的代码,哪里有什么跨线程的东东呢? [/quote]大神,你那个代码太卡了 ,帮忙想个其他的吧。
bage1234455 2014-12-30
  • 打赏
  • 举报
回复
引用 15 楼 lovelj2012 的回复:
[quote=引用 12 楼 u010774311 的回复:] [quote=引用 11 楼 u010774311 的回复:]
引用 11 楼 u010774311 的回复:
现在不用委托他们都不报错。。。[/quote] 你的代码,哪里有什么跨线程的东东呢? [/quote]不是的,我就是说我没加那个检查跨线程操作的那个语句啊
bage1234455 2014-12-30
  • 打赏
  • 举报
回复
引用 13 楼 Z65443344 的回复:
废话,这根本就没跨线程 什么是线程你也没弄明白吗?
定时器不是线程吗,它里面修改窗体label不是在跨线程吗
江南小鱼 2014-12-30
  • 打赏
  • 举报
回复
引用 12 楼 u010774311 的回复:
[quote=引用 11 楼 u010774311 的回复:]
引用 11 楼 u010774311 的回复:
现在不用委托他们都不报错。。。[/quote] 你的代码,哪里有什么跨线程的东东呢?
bage1234455 2014-12-30
  • 打赏
  • 举报
回复
引用 5 楼 lovelj2012 的回复:
bool isListening = false;
//启动线程
Thread t = new Thread(new ThreadStart(ListenThreadHandler));
t.Start();
isListening = ture;

private void ListenThreadHandler()
{
while(isListening)
{
//你的业务
}
}

FormClosing事件
{
isListening = false;
}
用了 while 感觉好卡啊,最多只能出来4个这个子窗口
於黾 2014-12-30
  • 打赏
  • 举报
回复
废话,这根本就没跨线程 什么是线程你也没弄明白吗?
bage1234455 2014-12-30
  • 打赏
  • 举报
回复
引用 11 楼 u010774311 的回复:
引用 11 楼 u010774311 的回复:
现在不用委托他们都不报错。。。
bage1234455 2014-12-30
  • 打赏
  • 举报
回复
bage1234455 2014-12-30
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
定时器为Timers.timer,而不是Form.Timer 那么它其实是以线程的方式运行的 你在里面写操作窗体的代码,就要使用委托 而使用了委托之后,如果被委托的对象不存在了,就会报错 在委托操作窗体之前加个bool变量判断一下窗体状态
我的VS有一次挂了,里面有些跨线程操作界面的代码我没有用委托,里面有些错误就报出来了,但是我VS没挂之前,他们都没报错。我也没有加那个什么跨线程检测的那个语句。
於黾 2014-12-30
  • 打赏
  • 举报
回复
CheckForIllegalCrossThreadCalls = false;
於黾 2014-12-30
  • 打赏
  • 举报
回复
你是否在不报错的那个窗体里加上了这个代码:
bage1234455 2014-12-30
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
定时器为Timers.timer,而不是Form.Timer 那么它其实是以线程的方式运行的 你在里面写操作窗体的代码,就要使用委托 而使用了委托之后,如果被委托的对象不存在了,就会报错 在委托操作窗体之前加个bool变量判断一下窗体状态
我没有加委托,但是也可以修改子窗体的label的颜色,但是我在另外一个界面中同样是Timers.timer ,不用委托就会报错。 咋回事哦
於黾 2014-12-30
  • 打赏
  • 举报
回复
定时器为Timers.timer,而不是Form.Timer 那么它其实是以线程的方式运行的 你在里面写操作窗体的代码,就要使用委托 而使用了委托之后,如果被委托的对象不存在了,就会报错 在委托操作窗体之前加个bool变量判断一下窗体状态
江南小鱼 2014-12-30
  • 打赏
  • 举报
回复
bool isListening = false;
//启动线程
Thread t = new Thread(new ThreadStart(ListenThreadHandler));
t.Start();
isListening = ture;

private void ListenThreadHandler()
{
while(isListening)
{
//你的业务
}
}

FormClosing事件
{
isListening = false;
}
bage1234455 2014-12-30
  • 打赏
  • 举报
回复
引用 3 楼 lovelj2012 的回复:
1、formclosing事件,增加timer.Enabled=false 2、调用线程的Abort要加try catch,Abort本身是通过引发异常终止线程的。不建议通过Abort终止线程,可以设置bool类型的变量,当变量为true的时候,才执行相关线程操作,formclosing的时候,把bool变量置为false。 另外,调用Abort之后,线程未必立刻关闭,清理资源后线程才会关闭
哦,你这个是开关门啊,那我怎么防止我在关闭窗口的时候不要让这个线程操作窗口呢/

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧