PS:对不起我的英语我能理解,但写起来并不是那么好。非常欢迎更正
首先,我在这里阅读了一些答案并且已经知道了我的问题...... 嗯,我在这里,因为如果没有其他解决方案,我需要对我的服务器进行一些痛苦的更改...
我们走了。
我有一台服务器和一台客户端在同一个端口上侦听和接听。 在我的服务器内部,我只有一个线程可以读取,处理和发送结果。这里没问题,没关系,但是我的客户端有多个线程正在做同样的事情,并导致错误的消息,如: 一个线程发送消息并等待答案, 其他线程发送其他消息,第一个线程将其作为答案捕获,所以第一个的真正答案是给第二个,所以所有2个接收错误的消息并导致客户端的大混乱。
我几乎可以肯定我需要使用端口来读取和写入或信号量,但是如果我可以绕过它,它将会非常有用。 有什么想法吗?
我的沟通课程:
public SenderAndRequester(string ipAdress, int port)
{
client = new TcpClient();
IPEndPoint ip_end = new IPEndPoint(IPAddress.Parse(ipAdress), port);
client.Connect(ip_end);
if (client.Connected)
{
stw = new StreamWriter(client.GetStream());
str = new StreamReader(client.GetStream());
stw.AutoFlush = true;
str.DiscardBufferedData();
}
}
public string communicate(string message)
{
var comming = str.ReadLineAsync();
stw.WriteLine(message);
return comming.Result;
}
这里使用它的类
public MyConstructor(){
com = new Communicator(new SenderAndRequester(ip, port));
while (!com.InitServer(firstVar,secondVar,...)) ;
//code continue ...
mnt = new Task(Tracker, ctsMonitor.Token, TaskCreationOptions.LongRunning);
mnt.Start();
}
类主线程......
private bool nextStatus()
{
//code continue..
if (!com.RequestNewStatus())
{
_Error = com.Error + " on communicator";
return false;
}
status = com.ServerStatus;
// code continue ...
return true;
}
和各种其他线程之一
private void Tracker()
{
while (!ctsMonitor.IsCancellationRequested)
{
//code continue
refresh = com.RequestCriticalData();
Thread.Sleep(100);
}
}