ASP.NET блокировка () не работает - PullRequest
1 голос
/ 27 января 2009

Я пытаюсь установить блокировку статического строкового объекта для доступа к кэшу. Блок lock () выполняется в моем локальном компьютере, но всякий раз, когда я развертываю его на сервере, он блокируется навсегда. я записываю каждый шаг в журнал событий, чтобы увидеть процесс, и блокировка (объект) просто вызывает тупик на сервере. Команда сразу после lock () никогда не выполняется, так как я не вижу записи в журнале событий. ниже код:

public static string CacheSyncObject = "CacheSync";
public static DataView GetUsers()
{

    DataTable dtUsers = null;
    if (HttpContext.Current.Cache["dtUsers"] != null)
    {
        Global.eventLogger.Write(String.Format("GetUsers() cache hit: {0}",dtUsers.Rows.Count));
        return (HttpContext.Current.Cache["dtUsers"] as DataTable).Copy().DefaultView;
    }

    Global.eventLogger.Write("GetUsers() cache miss");
    lock (CacheSyncObject)
    {
        Global.eventLogger.Write("GetUsers() locked SyncObject");

        if (HttpContext.Current.Cache["dtUsers"] != null)
        {
            Global.eventLogger.Write("GetUsers() opps, another thread filled the cache, release lock");
            return (HttpContext.Current.Cache["dtUsers"] as DataTable).Copy().DefaultView;
        }

Global.eventLogger.Write ("GetUsers () заблокирован SyncObject"); ==> это никогда не записывается в журнал, поэтому для меня это означает, что lock () никогда не выполняется.

Ответы [ 2 ]

6 голосов
/ 27 января 2009

Вы блокируете строку, что является плохой идеей в .NET из-за интернирования. Среда выполнения .NET фактически сохраняет все идентичные литеральные строки только один раз, поэтому у вас мало контроля над тем, кто видит конкретную строку.

Я не уверен, как среда выполнения ASP.NET справляется с этим, но обычная среда выполнения .NET фактически использует интернирование для всего процесса, что означает, что интернированные строки являются общими даже для разных доменов приложений. Таким образом, вы можете зайти в тупик между различными экземплярами вашего метода.

4 голосов
/ 27 января 2009

Что произойдет, если вы используете:

public static object CacheSyncObject = new object();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...