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

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

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

Метод MessageReceiverFirst принимает сокет и потом в отдельном потоке десериализует объект который передает этот же клиент. Когда делаю все в главном потоке все работает, как только я выполняю все это в отдельном потоке нечего не выходит глобальная переменная для десериализации всегда null. Подскажите что я упустил, не могу сообразить... Метод ацептера:
Листинг программы
  1. private void SocketAccepter()
  2. {
  3. Thread th = new Thread(delegate ()
  4. {
  5. Socket cl;
  6. Client cli;
  7. int Cur = 0;
  8. while (isServerRunning)
  9. {
  10. try
  11. {
  12. MyMSG += new Action<MessageLib.Message>(MyEvMeth);
  13. cl = listener.Accept();
  14. isDone = true;
  15. //MSGEvent();
  16. MessageReceiverFirst(cl);
  17. cli = new Client(cl, msg);
  18. if (MyEvent1 != null)
  19. {
  20. MyEvent1("\n\r" + "Client connected: ID:" + Cur.ToString() + "\n\r");
  21. }
  22. if (MyEvent != null)
  23. {
  24. MyEvent(cli);
  25. }
  26. }
  27. catch (Exception e)
  28. {
  29. MyEvent1("Exeption: "+e.ToString());
  30. }
  31. }
  32. });
  33. th.IsBackground = true;
  34. th.Start();
  35. }
Метод приема сообщения для десериализации
Листинг программы
  1. private void MessageReceiverFirst(Socket r_client)
  2. {
  3. //Для каждого нового подключения, будет создан свой поток для приема пакетов
  4. Thread th = new Thread( (object msg) =>
  5. {
  6. while (isDone)
  7. {
  8. //if (r_client.Connected)
  9. //{
  10. // Сюда будем записывать принятые байты
  11. byte[] bytes = new byte[1024];
  12. // Принимаем
  13. r_client.Receive(bytes);
  14. if (bytes.Length != 0)
  15. {
  16. msg = ((MessageLib.Message)Deserialize(bytes));
  17. }
  18. isDone = false;
  19. //}
  20. }
  21. Thread e = Thread.CurrentThread;
  22. e.Abort();
  23. });
  24. th.IsBackground = true;
  25. th.Start(msg);
  26. }
Метод десериализации:
Листинг программы
  1. public static object Deserialize(byte[] data)
  2. {
  3. using (var memoryStream = new MemoryStream(data))
  4. return (new BinaryFormatter()).Deserialize(memoryStream);
  5. }

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

textual
Листинг программы
  1.         private async Task MessageReceiverFirst(Socket r_client)
  2.         => await Task.Run(()=>
  3.         {
  4.             if (isDone)
  5.             {
  6.                 byte[] bytes = new byte[1024];
  7.  
  8.                 r_client.Receive(bytes);
  9.                 if (bytes.Length != 0)
  10.                 {
  11.                     this.msg = ((MessageLib.Message)Deserialize(bytes));
  12.                 }
  13.                 isDone = false;
  14.             }
  15.         });

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


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

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

8   голосов , оценка 3.75 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы