Вопросы заключаются в следующем: Согласно MSDN, когда поток получает блокировку, Monitor.Enter блокирует другие потоки, пока поток не снимет блокировку. Однако во время теста Monitor.Enter (объект) может блокировать выполнение другими потоками следующего блока кода в случае Thread, и он все еще выполняет следующий блок кода без блокировки в случае Task.
class program
{
static void Main(string[] ars)
{
for(int i = 0; i <5; i++)
{
new Thread(Func){ IsBackground = true}.Start();
}
Console.ReadKey();
//for(int i = 0;i< 5;i++)
//{
// Task.Factory.StartNew(Func);
//}
Console.ReadKey();
}
static void Func()
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}");
bool b = false;
Monitor.Enter(locker, ref b);
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} 执行 b = {b}");
}
}
Результат: Задача:
Тема:
Результат: Как показано на рисунке выше, Задача выполняет Monitor.Enter (locker) и выполняет следующий код дважды, в то время как Thread выполняет его только один раз.
Причина: лично вы подозреваете, что тот же поток может продолжать работать без снятия блокировки? Надеюсь ответ