2011-06-08 57 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