1

我在 ASP.NET 4.0 Web 应用程序的 Global.asax 中有以下代码

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. 其次,在 ProcessCompanyThread 中访问或修改“GlobalCompanyList”线程是否安全?如果不是,那么我必须做什么才能使其线程安全?

感谢帮助。

4

1 回答 1

1

1) AllCompanyList 在应用程序实例的生命周期内只有一个实例。IIS 可以并且将随意启动和停止应用程序实例(甚至一次运行多个应用程序实例),具体取决于它的配置方式。

GlobalCompanyList 本质上不是线程安全的。您可以通过锁定它来确保读取和写入它的安全。

lock(AllCompanyList)
{
    //make changes
}

线程安全和并发是复杂的——即使是上面的也不是完全安全的,因为它不会阻止某人尝试:

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

这是在锁之外。如果需要线程安全,最好的方法是将您的公司列表封装在线程安全对象中。

于 2011-05-16T05:57:12.160 回答