Как десериализовать в отдельном потоке ? - 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;
}
});