[英]C# error System.NullReferenceException
我在使用System.NullReferenceException時遇到一些問題。 當服務器執行操作時,我們首先檢查user不為null,然后斷開連接,服務器進行某些操作,然后嘗試使用戶進入System.NullReferenceException。 我有2萬多行代碼,所以我需要一些小東西,而不是一直檢查它是否為null ..我的服務器是多線程的,因此套接字在后台一直保持連接並斷開用戶的連接,因此這就是為什么。.我想在用戶斷開連接時停止該進度。 如果我到處都放“ try / catch”是個好方法嗎?
例:
if (User != null)
{
//do some things
System.Threading.Thread.Sleep(1000); //now we have time disconnect (This only for get error)
User.SendMessage("crash"); //<-- System.NullReferenceException... -.-
}
看起來在測試之后但在調用SendMessage
之前, User
的值正在更改。 如果您的應用程序是多線程的,我懷疑您在睡眠時另一個線程正在將User
設置為null。
一種選擇是獲取User
並對其進行檢查:
var user = User;
if (user != null)
{
//do some things
System.Threading.Thread.Sleep(1000);get error)
user.SendMessage("crash"); // Need to be sure user is in a valid state to make call
}
這樣,您可以確定自己有一個有效的參考。 您現在需要做的就是確保user
處於有效狀態,以供您調用SendMessage
。
更新:由於您一直避免添加try / catch塊,因此可以編寫一個輔助函數:
void WithUser(Action<User> action)
{
try
{
var user = User;
if (user != null) action(user);
}
catch(Exception e)
{
// Log it...
}
}
現在您可以說:
WithUser(user=>
{
System.Threading.Thread.Sleep(1000);
user.SendMessage("crash");
});
SendMessage
引發null異常,請檢查您的SendMessage
方法中的代碼
如果User
在調用前不調用SendMessage,則變為null:-
if (User != null)
{
User.SendMessage("crash"); //<-- No More System.NullReferenceException... -.-
}
誰在哪里將User
設置為null? 當線程休眠時,顯然有人將User變量設置為null,從而導致崩潰。
此外:“魔術般的睡眠”不會解決任何問題。 您需要在此處進行適當的鎖定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.