2011-04-20 71 views
1

我有下面的代碼在我的ASP.NET 4.0 Web應用程序的Global.asax中詞典<字符串,字符串>在Global.asax中定義的Application.Add

protected void Application_Start(object sender, EventArgs e) 
{ 
    Dictionary<string, string> AllCompanyList = new Dictionary<string, string>(); 
    Application.Add("GlobalCompanyList", AllCompanyList); 

    Thread ProcessCompanyThread = new Thread(new ParameterizedThreadStart(CompanyThread.Start)); 
    ProcessCompanyThread.IsBackground = true; 
    ProcessCompanyThread.Start(AllCompanyList); 
} 

我通過

訪問另一頁上
Dictionary<string, string> AllCompanyList = (Dictionary<string, string>)HttpContext.Current.Application["GlobalCompanyList"]; 
  1. 首先,是 「GlobalCompanyList」 只有在IIS中的 一生一個實例?

  2. 二,是「GlobalCompanyList」 線程安全地訪問或修改ProcessProanyThread中的 ?如果是 不是那麼我該怎麼做才能使它 線程安全?

感謝您的幫助。

回答

1

1)AllCompanyList將只有一個實例在應用程序實例的生命週期中。 IIS可以並將隨意啓動和停止應用程序實例(甚至一次運行多個應用程序實例),具體取決於它如何配置。

GlobalCompanyList本質上不是線程安全的。通過鎖定,您可以安全地閱讀和寫入。

lock(AllCompanyList) 
{ 
    //make changes 
} 

線程安全性和併發性是複雜的 - 即使上面沒有完全安全的,因爲它不會阻止有人企圖:

Application["GlobalCompanyList"].Add()... 

這是一個鎖之外。如果需要線程安全,最好的方法是將您的公司列表封裝在線程安全對象中。

相關問題