Shatoidil
@Shatoidil

Как сделать так, чтобы не зависала windows form при работе с сокетом?

Получаю данные с принтера и вывожу их в listbox, но проблема в том, что при получении данных с сокета зависает намертво форма..
Вот как выглядит метод, который я вызываю
public static string GetPrinterEvents(object server, object cmd)
        {

            string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><REA-JET>" +
                        "<REA-PI><VersionSelect><Version>3.5</Version>" +
                        "</VersionSelect></REA-PI></REA-JET>";
            char STX = '\u0002';
            char ETX = '\u0003';
            char LF = '\n';
            byte[] buffer = new byte[10240];

            Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipAdd = IPAddress.Parse((string)server);
            IPEndPoint remoteEP = new IPEndPoint(ipAdd, 22171);
            soc.Connect(remoteEP);
            byte[] byData = Encoding.UTF8.GetBytes("");
            soc.Send(byData);

            soc.Receive(buffer);

            byte[] getVersions = Encoding.UTF8.GetBytes(STX + "REA-PI" + ETX + LF);
            soc.Send(getVersions);

            soc.Receive(buffer);

            byte[] sendversion = Encoding.UTF8.GetBytes("Content-Length: " + xml.Length.ToString() + LF + LF + xml);
            soc.Send(sendversion);
            soc.Receive(buffer);

            //Отправка комманды
            xml = cmd;
            byte[] setCMD = Encoding.UTF8.GetBytes("Content-Length: " + xml.Length.ToString() + LF + LF + xml);
            soc.Send(setCMD);

            int iRx = soc.Receive(buffer);
            char[] chars = new char[iRx];
            Decoder d = Encoding.UTF8.GetDecoder();
            int charLen = d.GetChars(buffer, 0, iRx, chars, 0);
            String recive = new String(chars);
           
            iRx = soc.Receive(buffer);
            chars = new char[iRx];
            d = Encoding.UTF8.GetDecoder();
            charLen = d.GetChars(buffer, 0, iRx, chars, 0);
            
            recive = new String(chars);
            if (recive.Contains("successful executed"))
            {
                soc.Close();
                return "Исполнено!";
            }
            return recive;
        }
        public static string SetJob(string server, string filename)
        {

            string xml = "<REA-JET><REA-PI version=\"3.5\"><Command name=\"SETJOB\" id=\"0\"><Data><Job id=\"0\" /><Filename>"
                + filename + "</Filename></Data></Command></REA-PI></REA-JET>";
            return HandShake(server, xml);
        }


вот как я вызываю
var setResult = ReajetCmd.SetJob("169.254.133.223", 0, "test.job");

    listBox1.Items.Add(setResult);


Нет никакой возможности делать это в отдельном потоке? и результат выводить в листбокс? Если есть , то как это реализовать?
  • Вопрос задан
  • 170 просмотров
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Нет никакой возможности делать это в отдельном потоке?

Есть, используйте методы Socket.Begin***
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы