class VolatileClass{
volatile bool _loop = true;
static void Main()
{
VolatileClass vObj = new VolatileClass();
Thread tObj = new Thread(SomeThread);
tObj.Start(vObj);
Thread.Sleep(2000);
vObj._loop = false;
Console.WriteLine("_loop value set to false");
}
static void SomeThread(object o)
{
VolatileClass vObj = (VolatileClass)o;
Console.WriteLine("Loop started....");
while (vObj._loop)
{
}
System.IO.File.AppendAllText(@"MyPath\Thread.txt", vObj._loop.ToString());
Console.WriteLine("Loop end....");
}}
输出:
在发布模式下编译后,volatile关键字确保c#编译器在编译期间不会优化或重新排列代码。因此,在执行exe之后,将不会创建无限循环和文本文件。如果我删除volatile关键字,则会发生无限循环,并且不会创建文本文件。上面的代码是在控制台应用程序中完成的。
但是,如果我在Web API中执行相同操作并在发布模式下构建代码并使用debug =" false"运行应用程序。运行action方法后,使用或不使用volatile关键字创建文本文件。所以我的问题是volatile关键字在Web应用程序中是否起作用?或者我有什么遗失的东西吗?
以下是我的Web API代码
public class NotificationController{
public void VolatileTest()
{
VolatileClass vObj = new VolatileClass();
Thread tObj = new Thread(VolatileClass.SomeThread);
tObj.Start(vObj);
Thread.Sleep(5000);
vObj._loop = false;
}}
public class VolatileClass{
public bool _loop = true;
public static void SomeThread(object o)
{
VolatileClass vObj = (VolatileClass)o;
while (vObj._loop)
{
}
System.IO.File.AppendAllText(@"MyPath\Thread.txt", ((VolatileClass)o)._loop.ToString());
}
}