Блокировка потока с использованием чего-либо, кроме объекта - PullRequest
3 голосов
/ 05 мая 2010

при использовании блокировки вещь, на которую вы блокируете, должна быть объектом. Например, это законно

    static DateTime NextCleanup = DateTime.Now;
    const TimeSpan CleanupInterval = new TimeSpan(1, 0, 0);
    private static void DoCleanup()
    {
        lock ((object)NextCleanup)
        {
            if (NextCleanup < DateTime.Now)
            {
                NextCleanup = DateTime.Now.Add(CleanupInterval);
                System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(cleanupThread));
            }
        }
        return;
    }

Ответы [ 4 ]

10 голосов
/ 05 мая 2010

Вы можете заблокировать любой тип ссылки.

Поскольку DateTime не является ссылочным типом, вы не можете заблокировать его.
Если вы попытаетесь, каждый вызов Monitor.Enter будет получать различное значение DateTime в штучной упаковке, и блокировка будет фактически бесполезна.

Что вы пытаетесь сделать?
Что касается времени выполнения, то не имеет значения, какой объект вы заблокируете. (Блокировка объекта не будет магически запрещать другим потокам использовать объект, если они явно не блокируют один и тот же объект)
Когда вы блокируете объект, вы должны выбрать объект, который будет блокировать все необходимые фрагменты кода.

См. Также CA2002 .

6 голосов
/ 05 мая 2010

Имейте в виду, что даже если бы то, что вы пытаетесь сделать здесь, было возможно (т. Е. Если бы DateTime было ссылочным типом и, следовательно, чем-то, что вы могли бы заблокировать), это было бы недопустимо, потому что вы устанавливаете NextCleanup к новому значению в блоке lock.

Невозможно установить ссылку на новый объект в блоке кода, который заблокирован для этого объекта.

Вот почему желательно иметь выделенный объект «блокировки» для использования со всем кодом, который необходимо синхронизировать для связанных целей.

1 голос
/ 12 мая 2010

Похоже, что вы пытаетесь периодически запускать процедуру очистки. В этом случае вы можете использовать System.Threading.Timer, который специально предназначен для выполнения периодических задач.

0 голосов
/ 05 мая 2010

не имеет типа System.Object, но есть ли причина не использовать объект?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...