Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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#WebSocket.SendAsync()会随机卡住_C#_Wpf - Fatal编程技术网

C#WebSocket.SendAsync()会随机卡住

C#WebSocket.SendAsync()会随机卡住,c#,wpf,C#,Wpf,在套接字连接后,我使用以下代码从WPF使用System.Net.WebSocket发送 try { Console.WriteLine("Sending..."); await _ws.SendAsync(new ArraySegment<byte>(packet.GetBytes()), WebSocketMessageType.Binary, true, CancellationToken.None); Console.WriteLine("Sent...

在套接字连接后,我使用以下代码从WPF使用System.Net.WebSocket发送

try
{
    Console.WriteLine("Sending...");
    await _ws.SendAsync(new ArraySegment<byte>(packet.GetBytes()), WebSocketMessageType.Binary, true, CancellationToken.None);
    Console.WriteLine("Sent...");
}
catch(Exception e)
{
    Console.WriteLine(e.Message);
}
接收代码(Asp.Net核心)

公共异步任务StartReceiveAsync(接收操作)
{
WebSocketReceiveResult结果;
var buffer=新字节[4*1024];
var stream=newmemoryStream();
做
{
结果=wait _ws.ReceiveAsync(新的ArraySegment(缓冲区),CancellationToken.None);
wait stream.WriteAsync(缓冲区,0,result.Count);
if(result.EndOfMessage)
{
var packet=binarypack.FromRaw(stream.ToArray());
onReceive.Invoke(数据包);
}
}
而(!result.CloseStatus.HasValue);
处置();
}
我确实收到了一些数据,但在几个数据包之后,套接字卡在SendAsync中。即使等了几分钟也不会回来


好的,我想出来了。我的onReceive.Invoke()函数有时引发异常,导致服务器停止接收。这使得接收缓冲区填满,WebSocket.SendAsync被卡住,并等待缓冲区空闲。在try catch中包装onReceive.Invoke()之后,代码现在运行良好

try 
{
    onReceive.Invoke(packet);
}
catch(Exception e)
{
    Debug.WriteLine(e.Message);
}

调用代码是什么样子的?您是否一直在使用async/await?显示更多代码…查看线路的另一端以诊断此问题。如果它没有调用Receive(),那么当TCP传输缓冲区被填满时,您的程序最终会被卡住。我已经添加了发送和接收代码。我在循环中不断接收,如果缓冲区被填满,它应该在几个接收调用中变为空。我敢打赌,有人正在以某种方式处理句柄,失败源于此..这种情况发生在QueueClient(几乎25秒延迟)SendAsync中,不涉及接收器。我看到2个websocket跟踪,出现101个状态代码。
 public async Task StartReceiveAsync(Action<Packet> onReceive)
        {
            WebSocketReceiveResult result;
            var buffer = new byte[4 * 1024];
            var stream = new MemoryStream();
            do
            {
                result = await _ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
                await stream.WriteAsync(buffer, 0, result.Count);
                if (result.EndOfMessage)
                {
                    var packet = BinaryPacket.FromRaw(stream.ToArray());
                    onReceive.Invoke(packet);
                }
            }
            while (!result.CloseStatus.HasValue);
            Dispose();
        }
try 
{
    onReceive.Invoke(packet);
}
catch(Exception e)
{
    Debug.WriteLine(e.Message);
}