Как десериализовать в отдельном потоке ? - C#

Узнай цену своей работы

Формулировка задачи:

Метод MessageReceiverFirst принимает сокет и потом в отдельном потоке десериализует объект который передает этот же клиент. Когда делаю все в главном потоке все работает, как только я выполняю все это в отдельном потоке нечего не выходит глобальная переменная для десериализации всегда null. Подскажите что я упустил, не могу сообразить... Метод ацептера:
  private void SocketAccepter()
        {
            Thread th = new Thread(delegate ()
            {
                Socket cl;
                Client cli;
                int Cur = 0;
                while (isServerRunning)
                {
                    try
                    {
                        MyMSG += new Action<MessageLib.Message>(MyEvMeth);
                        cl = listener.Accept();
                        isDone = true;
                        //MSGEvent();
                        MessageReceiverFirst(cl);
                        cli = new Client(cl, msg);
 
                      if (MyEvent1 != null)
                        {
                            
                            MyEvent1("\n\r" + "Client connected: ID:" + Cur.ToString() + "\n\r");
                        }
 
                        if (MyEvent != null)
                        {
                            MyEvent(cli);
                        }
}
                    catch (Exception e)
                    {
                        MyEvent1("Exeption: "+e.ToString());
                    }
                }
            });
            th.IsBackground = true;
            th.Start();
        }
Метод приема сообщения для десериализации
private void MessageReceiverFirst(Socket r_client)
        {
 
            //Для каждого нового подключения, будет создан свой поток для приема пакетов
            Thread th = new Thread( (object msg) =>
            {
                while (isDone)
                {
                   
                    //if (r_client.Connected)
                    //{
                    // Сюда будем записывать принятые байты
                    byte[] bytes = new byte[1024];
                        // Принимаем 
                        r_client.Receive(bytes);
                        if (bytes.Length != 0)
                        {                        
                        msg = ((MessageLib.Message)Deserialize(bytes));
                        
                    }
                        isDone = false;
                       
                    //}
                }
            Thread e = Thread.CurrentThread;
            e.Abort();
 
        });
          
            th.IsBackground = true;
            th.Start(msg);
        }
Метод десериализации:
public static object Deserialize(byte[] data)
        {
            using (var memoryStream = new MemoryStream(data))
                return (new BinaryFormatter()).Deserialize(memoryStream);
        }

Решение задачи: «Как десериализовать в отдельном потоке ?»

textual
Листинг программы
        private async Task MessageReceiverFirst(Socket r_client)
        => await Task.Run(()=>
        {
            if (isDone)
            {
                byte[] bytes = new byte[1024];
 
                r_client.Receive(bytes);
                if (bytes.Length != 0)
                {
                    this.msg = ((MessageLib.Message)Deserialize(bytes));
                }
                isDone = false;
            }
        });

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5
Похожие ответы