.NET CF插槽接收超时(.NET CF Socket receive timeout)

2019-09-28 21:47发布

我工作的一个应用程序为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,但为什么程序流程永远不会结束? 怎么了?

Answer 1:

我应该通过我的例子创建为StateObject参数我BeginReceiveFrom方法WaitHandle的,我以后可以访问它的回调方法。 我编辑的代码和现在的工作。 事实上,我认为互联网上的相关样本是如此的软弱,太可怕了。

...
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));
}


Answer 2:

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

此外,如果数据正在等待时, BeginReceiveFrom方法可以同步处理(参见http://msdn.microsoft.com/en-us/library/system.iasyncresult.completedsynchronously.aspx )。 你应该首先检查你财产之前等待。



文章来源: .NET CF Socket receive timeout