Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';关闭的ClientWebSocket是否可以在不创建ClientWebSocket的新实例的情况下重新打开?_C#_Websocket_System.net.websockets - Fatal编程技术网

C# 为什么可以';关闭的ClientWebSocket是否可以在不创建ClientWebSocket的新实例的情况下重新打开?

C# 为什么可以';关闭的ClientWebSocket是否可以在不创建ClientWebSocket的新实例的情况下重新打开?,c#,websocket,system.net.websockets,C#,Websocket,System.net.websockets,我目前正在开发一个System.Net.WebSockets实现,它将使用蜂窝网络实时发送有关设备的数据包。使用蜂窝网络意味着我的解决方案应该能够在网络偶尔失去连接时重新连接套接字。我能够做到这一点的唯一方法是创建ClientWebSocket的新实例,然后异步发送connect消息 这不是我的确切代码,但希望它能让我明白我在做什么 void PublisherConnect() { myWebSocket=新客户端WebSocket(); Task.Run(异步()=> { i

我目前正在开发一个
System.Net.WebSockets
实现,它将使用蜂窝网络实时发送有关设备的数据包。使用蜂窝网络意味着我的解决方案应该能够在网络偶尔失去连接时重新连接套接字。我能够做到这一点的唯一方法是创建
ClientWebSocket
的新实例,然后异步发送connect消息

这不是我的确切代码,但希望它能让我明白我在做什么

void PublisherConnect()
{
myWebSocket=新客户端WebSocket();
Task.Run(异步()=>
{        
if(myWebSocket.ConnectionState!=WebSocketState.Open)
{                
尝试
{
等待myWebSocket.ConnectAsync(主机字符串);
}
捕获(WebSocketException ee)
{
Debug.WriteLine(ee.Message);
}
}
}
}
内部异步任务ConnectAsync(Uri)
{            
使用(var cts=new CancellationTokenSource())
{
尝试
{                    
等待myWebSocket.ConnectAsync(uri,CancellationToken.None);
手动状态=假;
}
捕获(例外)
{
投掷;
}
}
} 
如果我在完全断开连接后再次尝试连接同一对象,则会抛出一个错误,并显示消息“websocket已启动”。我不了解websocket的哪些方面


编辑-我正在将其构建到一个NuGet软件包中,用作其他应用程序的库,因此我需要继续使用.NET 4.6,因为程序将如何使用此功能。

一旦断开连接,套接字必须关闭。这是TCP/IP套接字的性质,WebSocket是基于此构建的。在您的情况下,我想看看是否可以获得Signal R c客户端正在工作,因为它会自动为您处理重新连接。@StephenCleary我添加了一个编辑解释(希望足够)为什么我不能使用Signal。你确实给了我一个想法,让我看看Signal是如何处理重新连接的,谢谢。好的。你必须自己处理关闭和重新连接逻辑,然后。:/关闭套接字并构造和连接一个新的套接字是处理这个问题的合适方法。这些类就是这样实现的。它们可以用一种可以多次关闭和重新打开它们的方式来实现,但是它们没有。因此,一旦关闭,如果要重新打开,请扔掉旧对象并构建一个新对象。