C# Form 线程错误 正在中止线程

C# Form 线程错误 正在中止线程,第1张

您好,

如果方便,请补充一下Lis方法的代码,我感觉错误应该是出在这里。

谢谢。

====================================

您好,

看过Lis代码,有些明白。

建议您从这个方向考虑一下:

线程Start后,会异步执行Lis方法,此时如果没有Client连接,则Socket应该处于StandBy状态也就是它会挂起当前线程以等待连接。而此时您About了线程,而线程正忙着监听,所以……自然会出现异常,但这个异常只不过是线程结束缓慢而已,并不属于严重或致命错误,如果您取消Try块,很可能此错误不会被IDE捕获。

我想大概是这个原因,您可以尝试写个方法在退出线程前把Socket Shutdown掉试试,如果没有异常,那问题就是出在这里了。

谢谢。

带有UI的C#程序在初始化界面或者由用户触发某一UI更新的时候常常会遇到这样的JIT异常:

System.ObjectDisposedException: Cannot access a disposed object.

Object name: 'XXXX'.

从字面上理解,就是无法得到一个已经被终止的对象。那么在什么情况下这样的事情会发生呢?

看一段代码就能够理解了。

Code

public AuthenticationForm()

{

// Required for Windows Form Designer support

InitializeComponent()

// TODO: Add any constructor code after InitializeComponent

call

this.action = FormAction.View

AppButtons.AppParent = this

this.EDITCTLS = new Control[] {RoleDGrid, RegionDGrid,

UserNameTBox, CheckAllButton, ClearAllButton, ActiveCkBox, RoleCheckAllButton,

RoleClearAllButton}

this.Initialization()

BeginAuth("GetUser", new object[]{AddUserButton})

}

Main方法执行了MainForm的初始化,完成必要组件实例化和数据导入,开始等待用户输入。

Ok,用户这时候点击了一个登录菜单,以上form

constructor代码经事件触发,开始执行,啪啪啪完成新form的初始化,最后一步看到BeginAuth方法,它要完成对用户的验证,如果验证通过,登录Form要显示,如果验证失败,主进程要返回错误信息,终止此form的所有资源。

但请注意,这个BeginAuth可不能随便写写。看看这段BeginAuth的实现吧:

DataManager.SendAsyncWSRequest(this, this.displayDelegate, spName, DataManager.XMLDOC.InnerXml,

hash)

DataManager是数据底层传输处理的接口,它是通用的。DataManager要发出WebService的数据请求,然后获得回答(response),再通过this传入的CallingForm实例调用Form的另一个方法EndAuth。

callingForm.EndAuth(resultXML, spName, hash, new ResponseArgs(false,

errorNode.InnerXml,

AsyncFailType.WSCaught))

EndAuth要解析WebService的response,判断是否验证通过,和相应Form的资源如何响应。以下是简单的EndAuth实现:

Code

if(resp.Success == false)

{

MessageBox.Show(re.Msg, spName + ": WebService call fails")

base.EndAuth(re.Msg, spName, hash, re)

this.Close()

return

}

else

UpdateDisplay()

Form在失败验证之后会被马上close掉,换句话说,this.Close()会终止form之前初始化的所有组件,GC不知不觉开始回收内存。。。。

本文的主题在这个return之后发生了。return一完成,它退到哪儿了?对,之前form

constructor的BeginAuth之后,也就是说,form还没有“出生”就已经被“堕”了。但被“堕”不等于什么也没有(null),毕竟“尸骨”犹在。MainForm在得知sub-form

constructor返回以后就会执行类似显示form的方法Show()。要秀就要拿到form句柄,但老子(mainform)拿到的却是一个夭折的孩子。。。当然怎么show也于事无补了。悲惨的Cannot

access a disposed object异常就这样发生了。由于是从Mainform触发,它会直接影响主进程,导致程序崩溃。

知道了来龙去脉,那么怎样避免呢?很简单,

1.不要在constroctor没有做完之前就任意终止资源(原则性)

拿示例来说的话,就是不要将BeginAuth方法置于构造方法内,置于Form_load()方法中不失为一良策。

2. 在拿来show之前要判断是否为空或已被终止(辅助性)

if (subForm!= null &&!subForm.IsDisposed)

subForm.Show()


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8168262.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存