我有一个继承自TcpListener的类,这个类Shadows Start方法只是为了调用基类Start()和基类BeginAcceptTcpClient()。有时会调用该方法,但端口未打开(netstat不显示端口打开)。
该课程看起来像这样
Public Class ExtendedTcpListener
Inherits System.Net.Sockets.TcpListener
Public Shadows Sub Start()
SyncLock (m_stopLock)
MyBase.Start()
MyBase.BeginAcceptTcpClient(AddressOf Me.CompleteAcceptTcpClient, Me)
My.Application.Log.WriteEntry("Extended Tcp Listener started ...", TraceEventType.Verbose)
End SyncLock
End Sub
有关正在发生的事情或如何调试问题的任何想法?由于Start()被无异常调用,我希望找到始终打开的端口(始终写入日志)。
额外信息:当Start方法正常工作时,它每次都有效,直到重新启动应用程序。如果Start方法不起作用,则在重新启动应用程序之前它将无法再次运行。
编辑:ExtendedTcpListener还有一个Stop方法:
Public Shadows Sub [Stop]()
SyncLock (m_stopLock)
MyBase.Stop()
My.Application.Log.WriteEntry("... extended Tcp Listener stopped", TraceEventType.Verbose)
End SyncLock
End Sub
使用ExtendedTcpListener的类实现IDisposable模式,并在Dispose内部调用ExtendedTcpListener.Stop。
发生问题时,日志中不会显示停止文本。
答案 0 :(得分:0)
可能是在第一次调用Start之后,其他方法/线程获取了对m_stopLock的锁定? (什么类型的对象是m_stopLock?)
您可以查看调试器并查看是否调用了阴影构造函数? (或在SynchLock之前设置跟踪)
答案 1 :(得分:0)
你不是要过早处理这个物体吗?
我们能看到你创建ExtendedTcpListener实例的代码,以及你如何管理它?
答案 2 :(得分:0)
这很奇怪,好吧。据我了解,一旦问题开始出现,您可以轻松复制,对吧?如果是这样,我会在那时将调试器附加到它并检查TcpListener对象及其底层Socket(m_ServerSocket
)。我在这里没有精确的说明,你只需要查看它,看看是否有什么东西看起来不合适或与事情发生时的方式不同。
答案 3 :(得分:0)
您继承TcpListener
并使用Shadows
覆盖非虚方法对我来说非常危险。您是否尝试将代码更改为不从TcpListener继承,而只是封装它?
编辑:添加了示例代码
Public Class ExtendedTcpListener
' Inherits System.Net.Sockets.TcpListener <== DO NOT INHERIT
Private MyTcpListener As New TcpListener()
Public Sub Start()
SyncLock (m_stopLock)
MyTcpListener.Start()
MyTcpListener.BeginAcceptTcpClient(AddressOf Me.CompleteAcceptTcpClient, Me)
My.Application.Log.WriteEntry("Extended Tcp Listener started ...", TraceEventType.Verbose)
End SyncLock
End Sub
' ...
End Class