2012-07-09 113 views
-1

是否有任何方法來設置靜態變量的生命週期 - 即:重置前多久保持活動狀態?我希望可以有一個可以應用的屬性。靜態變量的生命週期

+3

你是什麼意思(變量不會被重置 - 你的應用程序那樣),[你嘗試過什麼(http://forums.asp.net/t/1429625.aspx )? – CodeCaster 2012-07-09 11:34:54

+0

你能給我們一個你正在使用這個靜態變量的上下文嗎? – 2012-07-09 11:38:18

+0

「靜態」變量就是這個變量。它不會「重置」,直到您決定重置它。 – dasblinkenlight 2012-07-09 11:42:26

回答

3

靜態成員與類型本身相關聯,而不是類型的實例。因此,它們的生命週期僅限於創建它們的時間和順序,並且它們不會被類型的實例「重置」。

0

一個靜態變量用於應用程序的生命週期並在所有線程之間共享。它僅在應用程序重新啓動時重置(例如,web.config更改)。

如果這是爲了緩存,我建議設置一個定時器來定期更新值。

+0

我會對此謹慎。如果這個變量存在問題,這可能會使調試非常困難。特別是如果有其他開發人員進來排查故障。你最好使用一個實例變量。 – tsells 2012-07-09 11:39:32

+0

我同意這可能很難,這將非常依賴於問題的上下文。如果可以使用一個實例變量,那麼我認爲這會更簡單。我的答案是試圖回答如何過期靜態變量 - 如果一個更簡單的選項可用,那麼我會採取一個。 – Liath 2012-07-09 11:43:20

5

靜態變量中值的生命週期與包含AppDomain的值相同。 IE瀏覽器。如果你得到一個新的AppDomain(因爲你的IIS應用程序重新啓動),你會得到一個新的靜態變量副本。

1

在我的情況下,由於我使用的是ASP.NET,所以在一個請求的生命週期中,所討論的項目應該保持「活動」,因此在考慮之後,HttpContext [「Items」]集合將是最好的。例如,如果改爲:

private static SomeObject _books; 
    protected static SomeObject Books 
    { 
     get 
     { 
      if (_books == null) { 
       _books = new SomeObject(); 
      } 
      return _books ; 
     } 
    } 

    protected static SomeObject AVariable 
    { 
     get 
     { 
      SomeObject books = HttpContext.Current.Items["books"] as SomeObject; 
      if (books == null) { 
       books = new SomeObject(); 
       HttpContext.Current.Items["books"] = books; 
      } 
      return books; 
     } 
    }