C#winform使用了多线程,有时候程序再运行中直接就退出了!

如题,我现在写了一个程序,其中有一个listView控件,1个TIMER控件,和一个soket通信,我用timer控件每隔一分钟刷新一下listView控件中的数据,使用socket接收到消息后,创建了一个线程去刷新listView里面的数据,但是有时候程序就会出现直接退出的情况,特别是在socket接收到消息后,创建线程刷新listView就会出现这个情况,请有经验的大牛指点一下,是否我没有加锁,造成线程相互抢资源造成的程序崩溃呢?

直接退出是你的程序后台出现错误或是触发了异常所致,鉴于你同时用了timer和线程去刷新listView数据,可能是你创建线程刷新数据那里出错了~这个需要具体调试,但是我想说的是你的线程和timer 做的是同一件事情,timer本身就是实时去检测并刷新listView数据源的,socket无非是在接受到消息时刷新而已不是实时检测,你为什么要创建线程去刷新,每次接收到消息创建一个线程,用完之后又得销毁,之后收到消息又得重复同样的创建-销毁,浪费资源不说,还那么麻烦,你为什么不把刷新数据源封装成一个公共方法,timer里调用,当socket接收到消息时再调用即可,都可执行又不冲突~追问

我后来这样做了!因为timer的刷新频率是1分钟刷新一次,soket是想做实时刷新的!哎,大神你说的突然提醒我了,我可以把接收消息也放在timer里面,如果1分钟到了就刷新,不管soket有没有消息,没有到1分钟就查看soket有无消息。这样就省去了锁了,呵呵谢谢哈!!

追答

呵呵,这叫技术探讨,大家共同进步嘛,你那里遇到问题我这里只能提供思想与思路,具体调试与实现还是得靠你自己,不过很高兴很够帮到你~以后做类似的功能或是实现的时候,如果是同一类的操作或是实现,能够提取出来写公共的就提取公共,其他地方调用即可,这样也便于维护,也提高了你对模块间的逻辑思维能力。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-23
使用线程操作窗体控件的时候 需要使用委托。。。不然会出错的。。。。或者把错误提示发出来瞧瞧,加个try 捕获下异常。
private delegate void UpdateListViewCallback();
private void UpdateListView()
{
if (InvokeRequired)
Invoke(new UpdateListViewCallback(UpdateListView));
else
{
//更新ListView
}
}追问

还是谢谢你哈!

C#winform使用了多线程,有时候程序再运行中直接就退出了!
直接退出是你的程序后台出现错误或是触发了异常所致,鉴于你同时用了timer和线程去刷新listView数据,可能是你创建线程刷新数据那里出错了~这个需要具体调试,但是我想说的是你的线程和timer 做的是同一件事情,timer本身就是实时去检测并刷新listView数据源的,socket无非是在接受到消息时刷新而已不是实时检...

C# WinForm程序中,使用多线程,在关闭窗体时 怎么关闭窗体的所有线程。使...
程序退出的方法:this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出;Application.Exit(); 强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出;Application.ExitThread(); 强制中止调用线程上的...

C#winform程序运行到多线程后跳出
你的应该是 子线程处理过程中发生了异常 现在.net 的机制是:子线程发生的异常 在主线程是捕获不到的 子线程未处理的异常都会使程序退出。你最好在 子线程的函数里去捕获异常然后处理掉

C# WinForm 不抱错,自动退出的情况
这种有多半是由于线程冲突造成的。多半涉及到你线程中操作的对象的“释放”没处理好。(你可以打开此程序,然后到“任务管理器”中查看此程序的“线程数、IO读取写入、“GDI对象”、“内存占用”等信息,是否正常。记录下数据,然后程序开几分钟后,再看看。)...

C# WinForm 关闭之后还有进程在后台运行,如何实现彻底关闭
1、找到后台的运行线程,用BOOL变量控制;2、Environment.Exit(Environment.ExitCode); 用这个试试

写了一个C#winform程序,在我的电脑上运行没有问题,但是在别人的电脑运...
目测是缺少相关组件,你是否使用了第三方的dll或者其他第三方组件呢,如果有点话,一并放到bin目录下,这样就可以了 还是不行,建议把exe发我一份,测试一下 多谢

C#winform调用外部自己写的一个控制台程序,每次都是一闪而过,根本不执...
控制台窗口运行完毕后会自动关闭!在运行完毕的最后给它一个等待输入的console.read();就行了!可以防止运行完直接关闭数据无法获取!

VS2010编写的WinForm程序,在调试运行了几个小时候后弹出: 正在停止调试...
可能的原因:1、程序设计不合理,线程过多,达到了系统处理的极限而自动终止调试 2、有极占内存的死循环存在,检查下 3、有不安全代码(如果你是用C#编写的,这个可能性就较小了,或者说基本没有)建议:重新检查一遍你的程序,最好拿一张白纸来边检查边画个程序流程图,画完后审视一番,问题、缺陷...

C#中WinForm程序退出方法技巧总结
在C#中退出WinForm程序的方法有许多,如this.Close()、Application.Exit()、Application.ExitThread()、System.Environment.Exit(0)。其中,this.Close()仅关闭当前窗口,若非主窗体或存在托管线程,则无法实现程序干净退出;Application.Exit()强制关闭所有窗体,面对托管线程,同样难以正确退出;Application....

C# WINFORM 本人做的软件在很多电脑上正常一段时间后,有些许电脑出现了...
如果exe修改时间正常,那么病毒就可能是依靠印象劫持来进行破坏的)。如果有几台电脑上都出现这种问题,那么基本可以确定那个病毒应该是靠U盘传播的,要么是你的U盘,要么是其它人用过的U盘。“没问题的电脑的程序覆盖了有问题的电脑的程序”就正常,是exe被病毒感染一个很明显的现象。

相似回答