我的.net遠程處理服務器應用程序的遠程處理方法有時會在由於同步問題而被客戶端調用時掛起。這些方法執行一些數據庫讀/寫操作並將結果返回給客戶端。它不能正確處理數據庫鎖定,因此會出現懸掛問題。不幸的是,我們沒有使用數據庫的模塊代碼(用C++本機代碼實現),所以我必須找到解決方法。 我想如果服務器應用程序可以得到通知時,任何遠程處理方法掛起,服務器應用程序可以重新啓動自己。在我的情況下,重新啓動服務器應用程序是可以接受的,我已經找到了一種方法來做到這一點。那麼當遠程方法掛起時,有沒有什麼好方法可以讓服務器應用程序知道?如何檢測.net遠程處理方法是否掛在服務器應用程序端?
0
A
回答
0
假設一個超時是不夠好,你不需要解決halting problem:
public class TimeoutChecker
{
private static Dictionary<Thread, DateTime> hashTimeouts
= new Dictionary<Thread, DateTime>();
static TimeoutChecker()
{
new Thread(CheckThread).Start();
}
protected static void CheckThread()
{
while (true)
{
try
{
Thread.Sleep(500);
foreach (DateTime t in hashTimeouts.Values)
{
if (DateTime.Now.AddMilliseconds(10 * 1000) < t)
{
//Perform recovery logic.
}
}
}
catch (Exception) { }
}
}
public static void BeforeCall()
{
hashTimeouts.Add(Thread.CurrentThread, DateTime.Now);
}
public static void AfterCall() //be sure to execute in a finally...
{
hashTimeouts.Remove(Thread.CurrentThread);
}
}
這裏,BeforeCall和AfterCall將在本機調用外部的包裝,但遠程方法調用中。
當然,在調用本機代碼以避免死鎖之前使用同步可能是一個更好的主意。
0
您可以在Remoting連接上設置超時。當時間到了,但服務器的方法沒有返回時,Remoting會自動拋出RemotingException。
+0
如果服務器沒有返回(如果發生死鎖或甚至無限次睡眠),客戶端可能會收到RemotingException。那在服務器端呢?我不確定服務器應用程序也會得到RemotingException。 –
+0
對。來自客戶端的每個遠程調用都是在從內置的.NET線程池獲取的單獨線程上執行的。如果該線程發生死鎖或無限睡眠,它將永遠不會返回。您應該考慮重構服務器方法中的代碼。 @ebyrob對將調用同步到本機C++庫有一個很好的建議。 –
相關問題
- 1. .net遠程處理:檢測服務器是否沒有運行
- 2. NET遠程處理和無法連接到遠程服務器的客戶端
- 3. 如何限制.net遠程處理客戶端連接到.net遠程處理服務器?
- 4. 遠程處理(服務器端)
- 5. .NET Remoting如何處理遠程處理服務器端IP地址的變化
- 6. 測試遠程客戶端 - 服務器應用程序
- 7. C#.net遠程處理聊天客戶端/服務器
- 8. 從Swing應用程序到GWT服務器的遠程處理
- 9. 是否可以從Android應用程序連接到.NET遠程服務器?
- 10. VB6連接到遠程mySQL服務器掛起應用程序
- 11. 如何使用perl和Net :: OpenSSH檢測遠端是否只處理協議1?
- 12. 檢測Facebook應用程序是否從fanpage(服務器端)運行
- 13. 在客戶端 - 服務器應用程序中處理時間
- 14. 檢測應用程序是否在遠程應用程序中運行
- 15. 如何檢查遠程服務器映像是否存在?
- 16. 在.NET中檢測遠程DHCP服務器
- 17. 如何檢測服務器上是否呈現了React應用程序?
- 18. 遠程處理服務器自動發現。是否播放?
- 19. Web應用程序客戶端DNS服務器檢測
- 20. Ember示例應用程序與服務器端驗證處理
- 21. 如何處理應用程序,如果服務器不可用
- 22. Java客戶端/服務器遠程應用程序的起點
- 23. Android應用程序與遠程服務器後端?
- 24. 如何檢查我的.NET應用程序是否在終端服務器上運行?
- 25. 如何測試Linux中的遠程服務器是否啓動?
- 26. DataTables服務器端處理掛起
- 27. 無法在遠程服務器上運行Vaadin應用程序
- 28. 從服務器遠程處理powershell
- 29. 如何調用遠程方法服務?
- 30. 如何從.NET重新啓動遠程服務器上的COM +應用程序?
,你可以在一個單獨的線程asynchonously執行方法......如果執行時間花費太多時間,你「知道」它掛起... – Yahia
任何機會,你會停止使用遠程處理,並開始使用現代技術,如WCF –