并没有看出什么地方可能导致程序假死,这排版也太乱了.不妨调试一下程序,当出现你说的"假死"后暂停一下程序,看看线程都卡在哪里.
我们提供的服务有:网站制作、成都网站建设、微信公众号开发、网站优化、网站认证、陇南ssl等。为近千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的陇南网站制作公司
另外,从设计上来看,你这里并不需要多线程操作.
“卡死”是一个非常主观的描述,如果你要让主线程杀掉卡死的线程,那么你必须给“卡死”做出准确的定义。
什么是卡死?30秒没有响应就是卡死?那么“没有响应”的定义又是什么?
你给出这些条件以后,杀掉一个线程就不难。Abort方法,Dispose方法,都可以。
.net 为了安全,默认不允许跨线程访问操作控件。只能谁创建了控件,谁操作。
这个textbox只能从主线程访问。
解决方案一般有两个
1. 使用委托机制。委托创建线程去访问
2. 设置Me.CheckForIllegalCrossThreadCalls = False 表示不检测跨线程错误
试试这个怎么样,添加在子进程里面,就加在你批量传输代码里的每一个传输后面,也就是大批量中的每传输一个数据就暂停一下,而不是每一个大批量才暂停一下
System.Threading.Thread.Sleep(10) '让它走慢一点
用time控件啊,获取threadstate后,按指定时间间隔规定向界面刷新,线程必须是全局变量
用一个有退出条件的无限循环的sub也行。
线程开始就触发该过程,用无限循环来刷新状态,线程完成即退出无限循环。局部变量的线程也可以用这种方式。
不过用法要正确,否则会出问题。
多线程是用于处理复杂项目的
打个比方
你的主程序线程A中有个循环,由于代码是一行行走的,所以循环结束前下面的代码无法运行,而此时主界面的反应就类似卡死的样子,你点击按钮也没有反应,因为主线程在忙着循环呢,所以对按钮的事件代码要等待了,如果要避免这种情况,就要用到多线程,另开一个新线程专门用来执行循环代码,主界面就不会卡死了,只要在循环结束后将结果传回主线程调用就可以了,再复杂点要涉及到委托,控制了
按你的要求其实你的代码用不到多线程,只要把sleep放到两段代码中间就可以了。
新线程结束用thread.abort()