关于多线程异常处理
工作线程中如果抛出异常,那么这个异常在线程中是catch不到的,具体代码如下:
'工作线程中
Public Sub Action()
...
Dim httpReq As HttpWebRequest
httpReq = CType(WebRequest.Create(strURL), HttpWebRequest)
Try
httpResp = CType(httpReq.GetResponse(), HttpWebResponse)
Catch ex As Exception
' 处理该异常
...
End Sub
在getResponse()这里如果出现超时,则应该引发一个“操作超时”的异常,但是这个异常在工作线程中catch不到。按照一些文章的说法,我通过给Application.ThreadingException添加了一个Handler,使得这个异常可以抓到并处理了,代码如下:
'主线程中
...
'全局异常处理程序
Public Shared Sub MainThreadExceptionHandler(ByVal sender As Object, ByVal ex As ThreadExceptionEventArgs)
MessageBox.Show("应用程序发生了如下的异常信息" + ":" + ex.Exception.Message)
End Sub
Public Shared Sub MainThreadExceptionHandler(ByVal ex As Exception)
MainThreadExceptionHandler(Nothing, New ThreadExceptionEventArgs(ex))
End Sub
Public Shared Sub WorkerThreadExceptionHandler(ByRef eX As Exception)
' 通知全局异常处理程序
MainThreadExceptionHandler(Nothing, New System.Threading.ThreadExceptionEventArgs(eX))
End Sub
...
Public Sub myStartThreadMethod()
'在我启动线程的代码之前
AddHandler Application.ThreadException, AddressOf MainThreadExceptionHandler
'开启工作线程的Action()
...
End Sub
'''''''''''''''''''''''''
' 工作线程代码片段
Public Delegate Sub WorkerThreadExceptionHandlerDelegate(ByRef ex As Exception)
Public Sub Action()
...
Dim httpReq As HttpWebRequest
httpReq = CType(WebRequest.Create(strURL), HttpWebRequest)
Try
httpResp = CType(httpReq.GetResponse(), HttpWebResponse)
Catch ex As Exception
Dim myD1 As New WorkerThreadExceptionHandlerDelegate(AddressOf myMainThread.WorkerThreadExceptionHandler)
myD1.BeginInvoke(ex3, Nothing, Nothing)
...
End Sub
整个代码完成的功能就是开多个工作线程,采用同步方式分别对strURL地址发送http请求并等待响应,改进后的代码已经可以捕捉到“操作超时”的异常了,但是,捉到这个异常的同时却又出现了一个新的异常:
最有可能的“System.ObjectDisposedException”类型的异常出现在 system.dll 中
其他信息: 无法访问名为“System.Net.Sockets.NetworkStream”的已处置对象。
这个异常我是怎么也捉不到了,而且不知道是从哪抛出的,请大家帮忙看看是怎么回事吧,谢啦!
p.s.代码没有翻译成c#的,不好意思,急啊
问题点数:20、回复次数:3Top
1 楼Knight94(愚翁)回复于 2006-03-10 08:43:39 得分 20
you have a try as follows:
try
//your code
catch ex As Exception //define exception type
//first exception-handle
catch //don't define
//second exception-handle
endTop
2 楼rib06(诸刃突袭·掌上的明珠)回复于 2006-03-10 08:53:32 得分 0
tks!
Let me have a tryTop
3 楼rib06(诸刃突袭·掌上的明珠)回复于 2006-03-18 17:31:56 得分 0
呵呵,能不能抓到这个异常看来现在已经不重要了,重要的是要能及时终止线程,即使抛出了异常,那么没有什么。
再次感谢Knight94,现在星级人物越来越多了啊,惭愧惭愧; )Top




