簡體   English   中英

C#錯誤System.NullReferenceException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM