gpt4 book ai didi

vb.net - 为什么 Thread.Abort 仅在 isBackground 属性设置为 true 时才有效?

转载 作者:行者123 更新时间:2023-12-04 17:19:08 24 4
gpt4 key购买 nike

我正在开发一个小型 UDP 控制台来发送一些数据来测试一些 GPRS 设备,因此我修改了我在 CodeProject 中发现的一个使用一个线程的示例;但是当我想退出应用程序时遇到问题,即使我做了类似的事情,treahd 也拒绝停止

If UdpOpen Then
ThreadReceive.Abort()
Me.Dispose()
UdpOpen = False
End If

它停在第一行代码
Private Sub UdpReceive()
Dim receiveBytes As [Byte]() = receivingUdpClient.Receive(RemoteIpEndPoint) '<--Halt here
IpRemote(RemoteIpEndPoint.Address.ToString)
Dim BitDet As BitArray
BitDet = New BitArray(receiveBytes)
Dim strReturnData As String = System.Text.Encoding.ASCII.GetString(receiveBytes)
If UdpOpen Then
StartUdpReceiveThread(CInt(RemotePortLbl.Text))
End If

PrintLog(strReturnData)
End Sub

所以我做了一些研究,通常在这个网页中找到了解决方案
Stop a thread that prevents program to close?

而且,正如第一条评论所说,我转向 True isBackground 属性并且它起作用了,现在的问题是为什么?

有人更深入地了解它的工作原理吗?

最佳答案

只有当 CLR 知道这样做是安全的时,线程才可以中止。当线程深埋在操作系统调用中时,情况就不是这样了。这从根本上是不安全的,因为 CLR 无法知道线程是否已获取任何需要再次释放的内部操作系统锁。

通过将 IsBackground 属性设置为 true,您可以告诉 CLR 线程不被中止是可以的,但让操作系统来清理任何需要释放的东西。任何被占用的锁都不会再导致任何问题,因为任何可能死锁的代码都无法再运行。操作系统负责释放套接字使用的操作系统资源。如果您的程序由于任何其他原因中止,就像您使用任务管理器终止它一样。

正确的方法是调用套接字的 Dispose() 方法。这会拉动操作系统调用的地板垫,它将停止等待接收任何东西,因为套接字是一个死鹦鹉。 Receive() 调用将完成一个 ObjectDisposedException,准备捕获它。

另一个非常常见的情况是根本不使用线程,而是使用 BeginReceive()。 Cleanup 的工作方式大致相同,当您调用 Dispose() 时,回调将运行。当您调用 EndReceive() 时,您会收到 ObjectDisposedException。同样,准备好捕获它并快速离开,而不用对 socket 做任何其他事情。

使用 Thread.IsBackground 是处理关闭的一种非常合理的方法,假设您不必做任何复杂的事情来告诉线路另一端的程序您停止监听消息。

关于vb.net - 为什么 Thread.Abort 仅在 isBackground 属性设置为 true 时才有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22762580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com