我将要运行一个简单的样例代码,涉及到线程和临界区。
以下是我的代码:
public static void DoCriticalWork(object o)
{
SomeClass instance = o as SomeClass;
Thread.BeginCriticalRegion();
instance.IsValid = true;
Thread.Sleep(2);
instance.IsComplete = true;
Thread.EndCriticalRegion();
instance.Print();
}
我将其称为以下名称:
private static void CriticalHandled()
{
SomeClass instance = new SomeClass();
ParameterizedThreadStart operation = new ParameterizedThreadStart(CriticalRegion.DoCriticalWork);
Thread t = new Thread(operation);
Console.WriteLine("Start thread");
t.Start(instance);
Thread.Sleep(1);
Console.WriteLine("Abort thread");
t.Abort();
Console.WriteLine("In main");
instance.Print();
}
然而,我得到的输出是:
**
Start thread
Abort thread
In main
IsValid: True
IsComplete: False
鉴于关键区域已定义,IsComplete应该为true而不是false。
有人能解释一下为什么它不起作用吗?
以下是SomeClass的参考:
public class SomeClass
{
private bool _isValid;
public bool IsValid
{
get { return _isValid; }
set { _isValid = value; }
}
private bool _isComplete;
public bool IsComplete
{
get { return _isComplete; }
set { _isComplete = value; }
}
public void Print()
{
Console.WriteLine("IsValid: {0}", IsValid);
Console.WriteLine("IsComplete: {0}", IsComplete);
Console.WriteLine();
}
}
编辑
MCTS笔记中的解释: 关键区域的概念是提供一个必须像单行代码一样执行的代码区域。任何试图在线程位于关键区域内时中止它的尝试都必须等待关键区域完成后才能进行。此时,线程将被中止并抛出ThreadAbortException。以下图示说明了具有和不具有关键区域的线程之间的区别: