2015-07-22 118 views
1

我在Windows服務中使用異步回調來接收網絡上的UDP數據廣播。捕獲在UDPClient.EndReceive拋出的ObjectDisposedException異常

該回調使用UDPClient.EndReceive()方法結束待處理的異步接收。在服務OnStop()方法I UDPClient.Close()期間的UDP客戶端。在此之後,我經常在異步回調的下一個EndReceive()調用中獲得ObjectDisposedException,該回調正在另一個線程上訪問。

很明顯,我在接收回調中發現這個異常並沒有問題,但我想確信在關閉服務時(如預期)拋出被捕獲的ODE,而不是因爲某些其他原因。我可以創建一個設置的布爾型標誌,並指出服務何時停止,並在catch塊中檢查該標誌,但是我覺得我忽略了更優雅的解決方案。

我該如何確保我所捕捉的ODE是預期的ODE,而不是真正意想不到的異常?

+0

正好趕上ODE和不添加任何口哨,他們只是增加線程錯誤到你的代碼。 MSDN文檔通常不會描述所有可能的異常,但是在Socket.EndReceive()文章中,ODE的含義非常明確。這個插座是一個死亡的士兵,趕上ODE並快速離開。 –

+0

感謝Hans提供的信息。該文章明確表示ODE對於套接字意味着什麼,這是真的,但對於套接字已關閉的原因似乎並不明確。我知道你的建議可能是生產的方式,但是在測試中,我仍然想要一種方法來確保ODE是由於我的**預期處置UDP客戶端而導致套接字關閉,而不是由於其他錯誤或錯誤或故障。真的沒有必要嗎? – khargoosh

+0

必須趕上ODE是不使用良好協議的標誌。另一臺機器並沒有像它應該說再見。但這很常見,通常是因爲沒有這樣的協議。或者因爲有人蔘與,即使沒有完成,他也想停止該程序。 UDP已經是一個失敗的原因。 –

回答

0

我結束了使用bool標誌來指示服務正在停止。該serviceStopping標誌設置在服務的調用OnStop()方法true,當ObjectDisposedException被抓檢查:

try 
{ 
    datagram = client.EndReceive(arClient, ref remoteEP); 
} 
catch (ObjectDisposedException) 
{ 
    //if the service is stopping this is expected 
    if(serviceStopping) 
    { 
     //return without further processing 
     //in the receiveCallback 
     return; 
    } 

    //otherwise rethrow the exception 
    throw; 
} 
相關問題