我目前正在尝试做一个小型服务器,但我遇到了一个问题,我相信是一个僵局。而我的问题是如何真正避免C#Tcp中的死锁问题?让我给你看一些东西。C# - 如何避免使用TcpClient死锁?
public static void SendString (TcpClient klient, string message) {
byte[] byteBuffer = Encoding.UTF8.GetBytes(message);
NetworkStream netStream = klient.GetStream();
netStream.Write(byteBuffer, 0, byteBuffer.Length);
netStream.Write(new byte[] { separator }, 0, sizeof(byte));
netStream.Flush();
}
public static string AcceptString (TcpClient klient) {
List<int> buffer = new List<int>();
NetworkStream stream = klient.GetStream();
int readByte;
while ((readByte = stream.ReadByte()) != 0)
buffer.Add(readByte);
return Encoding.UTF8.GetString(buffer.Select<int, byte>(b => (byte)b).ToArray(), 0, buffer.Count);
}
当双方都试图拨打SendString()
(对方)时会发生死锁吗?如果不是,究竟是什么导致了死锁?我的意思是我知道什么是僵局(当双方都在等待对方的行动时),但是它实际上在C#网络中意味着什么?
死锁是死锁。所有语言都一样。 http://stackoverflow.com/questions/8064296/is-deadlock-possible-when-locking-one-global-object-in-asp-net-mvc-application – Eser
这不是一个死锁,它是一个无效的通信协议。当双方沟通时,messgaes的形成方式被终止,消息的确切顺序称为协议。要想出一个不会导致此类问题的有效协议,请研究一些现有的协议(如HTTP)以获得此想法。 –
是什么让你觉得呢? AcceptString永远不会返回这个特定的代码,因为连接永远不会被发送者关闭。这不是一个僵局。 – usr