powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / TcpClient, NetworkStream под WinCE 6.0 .Net 3.5
4 сообщений из 4, страница 1 из 1
TcpClient, NetworkStream под WinCE 6.0 .Net 3.5
    #38976210
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Пишу приложение для ТСД под WinCE 6.0 на .Net 3.5 (Опыта на C# ровно 4 дня разработки)
Возник вопрос в том, что многое не поддерживается. Например для NetworkStream не поддерживается свойство ReadTimeout. А TcpClient не поддерживает ReceiveTimeout. При том поддерживается только синхронный режим.
В следующем коде:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
TcpClient сlientSocket = new TcpClient(XmlOptions.Options.Server, XmlOptions.Options.Port);
NetworkStream stream = сlientSocket.GetStream();
stream.Write(bytesSent, 0, bytesSent.Length);
do
{
  bytes = stream.Read(bytesReceived, 0, bytesReceived.Length);
  strXMLResponse = strXMLResponse + Encoding.GetEncoding(1251).GetString(bytesReceived, 0, bytes);
}
while (stream.DataAvailable);


Если после stream.Write сервер мне не ответит, или например оборвется связь (умер маршрутизатор на 14 прыжке) то приложение зависнет на строчке bytes = stream.Read, т.к. будет ждать вечно без таймаута.
Каким образом можно решить эту проблему?
...
Рейтинг: 0 / 0
TcpClient, NetworkStream под WinCE 6.0 .Net 3.5
    #38976255
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оффтопег. А что - wince еще жив?
...
Рейтинг: 0 / 0
TcpClient, NetworkStream под WinCE 6.0 .Net 3.5
    #38977021
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhоффтопег. А что - wince еще жив?
На наших ТСД стоит Win CE 5.0 и WinCE 6.0. От 5-ки по тиху заменяют 6-ками. А приложение для склада надо написать под них.

Пока есть идея создать отдельную нить, в которой запустить TcpClient и в главной нити ждать таймаут окончания выполнения нити.. Если истек, то срубить нить...
...
Рейтинг: 0 / 0
TcpClient, NetworkStream под WinCE 6.0 .Net 3.5
    #38982818
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что удалось сделать...
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
        private void ReadStreamAsync()
        {
            try
            {
                .....
                do
                {
                    // Читаем данные из сокета
                    bytes = FStream.Read(bytesReceived, 0, bytesReceived.Length);
                    // Дописываем прочитанные данные в память
                    .....
                } //Читаем дальше пока есть данные в сокете или пока сообщение не дошло целиком
                while ((FStream.DataAvailable) || ((FMemStream.Length - 4) < size));
            }
            catch // Пока глушим все исключения, чтобы не вызвать ThreadAbortException
            {
            }
            // Устанавливаем событие
            FEvent.Set();
        }

                FEvent.Reset();
                // Запускаем нить, в которой будем читать из сокета данные
                Thread t = new Thread(ReadStreamAsync);
                t.Start();
                // Ждем установку события с таймаутом
                Boolean eventSignal = FEvent.WaitOne(15000, false);
                // Если был таймаут события...
                if (!eventSignal)
                {
                    // ...то закрываем поток сокета...
                    FStream.Close(); //После выполнения этого метода, если в нити зависли на FStream.Read то она навернется с ошибкой, тем самым сняв блокировку.
                    // ...и ждем пока нить не просигналит нам о завершении
                    FEvent.WaitOne();
                    throw new EDataCommunication(DataCommunicationStrings.ErrorResponse);
                }
                else
                {
                    // Обрабатываем полученные данные
                }


На каждом шагу в .Net 3.5 Compact подводные камни....
TCP клиент не поддерживает асинхронный режим.
Нити не поддерживают ResetAbort() чтобы отменить ThreadAbortException.
Поэтому t.Abort(); просто валит приложение. А если в методе работающем в другой нити не заглушить исключение, которое пробросится наружу, то опять получим ThreadAbortException.
Пока это работает...
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / TcpClient, NetworkStream под WinCE 6.0 .Net 3.5
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]