Как десериализовать в отдельном потоке ? - 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;
- }
- });
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д