У меня есть приложение, которое использует Networkstream для связи с сервером.Чтение и запись происходит в двух разных потоках.Один поток всегда прослушивает данные, поступающие с сервера, а другой поток записывает данные в поток для отправки запроса.Затем сервер обрабатывает данные и затем отправляет обратно номер заказа, но поскольку я пишу и читаю в двух потоках, я не могу прочитать в том потоке, в котором я первоначально отправляю данные на сервер.
Моя проблема заключается в том, что я создаю элемент списка просмотра для каждого запроса, отправляемого на сервер, и мне каким-то образом необходимо определить элемент списка просмотра, который соответствует полученному номеру заказа.
private void SendCheckoutData()
{
//Start sending data
manager.SendInt(TableId);
Thread.Sleep(80);
manager.SendInt(ClientId);
Thread.Sleep(80);
manager.SendInt(ListViewCheckoutTable.Items.Count);
Thread.Sleep(80);
manager.SendInt(GetCombinedPrice());
Thread.Sleep(80);
int NumberOfItems = 0;
for (int i = 0; i < ListViewCheckoutTable.Items.Count; i++)
{
OrderMenuItem item = (OrderMenuItem)ListViewCheckoutTable.Items.GetItemAt(i);
manager.SendInt(item.Id);
Thread.Sleep(80);
manager.SendInt(item.Quantity);
Thread.Sleep(80);
NumberOfItems += item.Quantity;
}
int OrderNumber; //The variable I somehow need to assign the value to
ListViewPendingOrders.Items.Add(new PendingOrderMenuItem { OrderNumber = OrderNumber, Quantity = NumberOfItems, TotalPrice = GetCombinedPrice() });
}
TCPManager
class TCPManager
{
private readonly string ip;
private readonly int port;
TcpClient client;
NetworkStream stream;
Task ListenerTask;
CancellationTokenSource cancelToken = new CancellationTokenSource();
public TCPManager(string ip, int port)
{
this.ip = ip;
this.port = port;
}
public void Connect()
{
client = new TcpClient(ip, port);
stream = client.GetStream();
}
public void Disconnect()
{
cancelToken.Cancel();
while (!ListenerTask.IsCompleted)
{
Thread.Sleep(10);
}
stream.Close();
client.Close();
}
public void ReadData()
{
ListenerTask = new Task(() =>
{
while (true)
{
while (!stream.DataAvailable)
{
Thread.Sleep(100);
}
Thread.Sleep(100);
StartNewTask(GetInt());
}
}, cancelToken.Token, TaskCreationOptions.LongRunning);
}
private void StartNewTask(int request)
{
switch (request)
{
case RequestIds.REQUEST_ORDERNUMBER:
break;
case RequestIds.REQUEST_ORDER_COMPLETED:
break;
}
}
public int GetInt()
{
byte[] bData = new byte[sizeof(int)];
stream.Read(bData, 0, bData.Length);
int Data = BitConverter.ToInt32(bData, 0);
return Data;
}