Сетевой поток нескольких потоков и передачи данных - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть приложение, которое использует 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;
        }
...