.NET CF套接字接收超时

本文关键字:超时 套接字 CF NET | 更新日期: 2023-09-27 17:58:43

我正在为.NET CF 3.5 SP1开发一款适用于Windows CE 5.0的应用程序。我想模拟套接字接收超时并写一些代码:

    ...
    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,但为什么程序流永远不会结束?怎么了?

.NET CF套接字接收超时

我应该将我创建的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));
}

我认为您在事件句柄中设置的WaitHandle与您创建并正在等待的auto不同。BeginReceiveFrom方法返回一个IAsyncResult对象,其中包含您正在发出信号的句柄。

此外,如果数据正在等待,则可以同步处理BeginReceiveFrom方法(请参阅http://msdn.microsoft.com/en-us/library/system.iasyncresult.completedsynchronously.aspx)。您可能应该在等待之前先检查该属性。