.NET CF Socket получает тайм-аут - PullRequest
1 голос
/ 08 июня 2011

Я работаю над приложением для Windows CE 5.0 от .NET CF 3.5 SP1.я хочу смоделировать тайм-аут приема сокетов и написал несколько кодов:

    ...
    AutoResetEvent auto = new AutoResetEvent(false);
    mySocket.BeginReceiveFrom(arrData, 0, 4, SocketFlags.None, ref EP, new AsyncCallback(ReceiveCallback), mySocket);
//if (auto.WaitOne(10000,false)) or :
    if (auto.WaitOne())
    {
// program flow never comes here, even after setting signal!
    _log.AppendLine("Message receive success");
    }
    ...

и вот мой метод обратного вызова:

void ReceiveCallback(IAsyncResult ar)
        {

            bool b = ((EventWaitHandle)ar.AsyncWaitHandle).Set();
            _log.AppendLine(string.Format("AsyncWaitHandle.Set() called and returned {0}",b));

        }

, поскольку я протестировал приложение и зарегистрировал некоторую информацию, я сразу получаю данные иar.AsyncWaitHandle.Set () возвращает значение true, но почему выполнение программы никогда не заканчивается?что не так?

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Я должен передать WaitHandle, который я создал, например, как параметр StateObject, в мой метод BeginReceiveFrom, чтобы я мог получить к нему доступ позже в методе обратного вызова. я отредактировал мой код, и теперь он работает. на самом деле, я думаю, что похожие образцы в интернете такие слабые и ужасные.

...
EventWaitHandle auto = new EventWaitHandle(false, EventResetMode.ManualReset);
auto.Reset();
mySocket.BeginReceiveFrom(arrData, 0, 4, SocketFlags.None, ref EP, new AsyncCallback(ReceiveCallback), auto);
if (auto.WaitOne(10000, false))
{
_log.AppendLine("Message lenght receive success");
}
...

и

void ReceiveCallback(IAsyncResult ar)
{

bool b = ((EventWaitHandle)ar.AsyncState).Set();
_log.AppendLine(string.Format("AsyncWaitHandle.Set() called and returned {0}",b));
}
0 голосов
/ 08 июня 2011

Я не думаю, что WaitHandle, установленный вами в дескрипторе события, совпадает с auto, который вы создали и ожидаете. Метод BeginReceiveFrom возвращает объект IAsyncResult, который содержит дескриптор, о котором вы сигнализируете.

Также, если данные ожидают, метод BeginReceiveFrom может обрабатываться синхронно (см. http://msdn.microsoft.com/en-us/library/system.iasyncresult.completedsynchronously.aspx).. Вероятно, вам следует сначала проверить это свойство, прежде чем ждать.

...