2011-06-08 138 views
1

我正在使用.NET CF 3.5 SP1的Windows CE 5.0的应用程序。我想模拟插口接收超时,并写了一些代码:.NET CF套接字接收超时

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

回答

1

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

你的问题现在得到了解答吗?我不确定你是否需要更多的帮助。 – 2011-06-08 14:23:23

+0

@ C.Evenhuis,是的。谢谢。 – losingsleeep 2011-09-14 08:13:55

0

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

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

+0

是üR右。他们不一样。我应该将我创建的WaitHandle作为StateObject参数传递给我的BeginReceiveFrom方法。我编辑了我的代码,现在它可以工作。我会把它放在这里。谢谢 – losingsleeep 2011-06-08 10:50:46