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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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有无消息。这样就省去了锁了,呵呵谢谢哈!!

追答

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

参考技术A 使用线程操作窗体控件的时候 需要使用委托。。。不然会出错的。。。。或者把错误提示发出来瞧瞧,加个try 捕获下异常。
private delegate void UpdateListViewCallback();
private void UpdateListView()

if (InvokeRequired)
Invoke(new UpdateListViewCallback(UpdateListView));
else

//更新ListView

追问

还是谢谢你哈!

C# Winform 多线程 SOCKET 文件上传,下载

一个S, 服务器端
N个C,客户端

上传
S随时监听端口,C发来上传文件请求后开始接收文件,如果网络中断,下次C再连接的时候,可以支持上一次文件断点续传

下载
S随时监听端口,C发来下载文件请求后开始发送文件,如果网络中断,下次C再连接的时候,可以支持上一次文件断点续传

参考技术A 这可是很麻烦的,自己到网上找吧 参考技术B 文件数据流传输方法,自己定义握手协议就可以实现,底层SOCKET的代码网上多的是本回答被提问者和网友采纳 参考技术C 这个很麻烦的网上找一下教程吧。 参考技术D 服务器保存上传的每个(未完成)文件信息(如:已上传的流的位置)及特定的文件标识,客户端保存未完成(下载)的文件信息及特定标识;每次上传或下载文件时将相关信息写入协议中,传送到对方,对方解析后再进行数据传输。
如果客户端较多的话,可以考虑客户端先连接到服务器,再由服务器进行反连接。这样不会阻塞服务器的监听。

以上是关于C#winform使用了多线程,有时候程序再运行中直接就退出了!的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 跨线程操作winform程序窗体

多线程——讲的不错,认认真真做的笔记,认真再看!

C# Winform 多线程 SOCKET 文件上传,下载

C#winform 关于调用外部程序的问题

WinForm 进程 ,线程

JAVA多线程之CountDownLatch