当使用锁时,你锁定的东西必须是一个对象.例如,这是合法的
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;
}
解决方法:
请注意,即使您尝试在此处执行的操作是可能的(即,如果DateTime是引用类型,因此您可以锁定它),那么它将是合法的,因为您将NextCleanup设置为新的值.锁定块.
您无法在已锁定该对象的代码块中设置对新对象的引用.
这就是为什么建议使用专用的“锁定”对象来为所有需要为相关目的同步的代码.