Web API

时间:2017-06-23 11:22:09

标签: c# asp.net-web-api volatile

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....");
    }}

输出:

  1. 使用volatile关键字:创建文本文件,exe执行结束。
  2. 没有Volatile关键字:未创建文本文件且exe不会结束。
  3. 在发布模式下编译后,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());
        }
    }
    

0 个答案:

没有答案