所以我在一个asp.net(C#)应用程序(非常糟糕的方法)中运行套接字服务器,通知任何连接的设备, 就像我开始在这家公司工作一样,改变它并不是我的主管的优先事项,即使它会更好。
所以当我们对网站进行更新时,Socket连接保持打开状态(在另一个线程中),然后我们必须重新启动服务器,但我想要做的是以某种方式在启动时获取线程ID套接字,然后存储它,如果更新完成,它应该重新连接到该线程并以某种方式结束Socket或重置它。
这可能吗?
这是示例代码
private void Start()
{
_socketServer = new TcpListener(IPAddress.Any, Convert.ToInt32(ConfigurationManager.AppSettings["NotificationSocketPort"]));
_socketServer.Start();
_acceptingThread = new Thread(() =>
{
while (true)
{
try
{
var client = _socketServer.AcceptTcpClient();
StartClient(client);
}
catch (ObjectDisposedException ex)
{
_acceptingThread = null;
_socketServer = null;
Start();
break;
}
}
});
_acceptingThread.Start();
}
public void Close()
{
if (_acceptingThread != null)
{
_acceptingThread.Abort(0x0);
_socketServer.Stop();
_acceptingThread = null;
_socketServer = null;
}
}
在global.asax
中protected void Application_End(object sender, EventArgs e)
{
SocketNotifier.GetNotifierInstance().Close();
}
SocketNotifier正在使用Singleton设计模式
答案 0 :(得分:2)
答案 1 :(得分:1)
他们[套接字]保持打开状态,这是IIS工作进程终止并启动新进程后的问题
可能IIS无法关闭旧流程。这使插座保持打开状态。您的套接字线程是前台线程。它不会阻止进程终止。此外,中止线程不会影响IO。当套接字关闭时,套接字监听方法会自动重启。
删除这些问题。使线程成为后台线程。不要中止它。如果是ObjectDisposedException
,请不要重新启动它。