1

ASP.NET4.0Webアプリケーションの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の存続期間中にインスタンスが1つしかないのですか?

  2. 次に、「GlobalCompanyList」スレッドはProcessCompanyThreadでアクセスまたは変更しても安全ですか?そうでない場合は、スレッドセーフにするために何をする必要がありますか?

手伝ってくれてありがとう。

4

1 に答える 1

1

1) AllCompanyList は、アプリケーション インスタンスの存続期間中、インスタンスを 1 つだけ持ちます。IIS は、構成方法に応じて、アプリケーション インスタンスを自由に開始および停止できます (また、複数のアプリケーション インスタンスを同時に実行することもできます)。

GlobalCompanyList は本質的にスレッドセーフではありません。ロックすることで、読み書きを安全に行うことができます。

lock(AllCompanyList)
{
    //make changes
}

スレッドの安全性と並行性は複雑です - 上記の方法でさえ完全に安全というわけではありません:

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

これはロックの外側にあります。スレッド セーフが必要な場合の最善の方法は、企業リストをスレッド セーフ オブジェクトにカプセル化することです。

于 2011-05-16T05:57:12.160 に答える