ASP.NET 定时器回调方法的重入

作者:袖梨 2022-06-25

 

 代码如下复制代码

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceNET.MST.Sixth.Reenter

{

  classReenter

  {

    //用来造成线程同步问题的静态成员

    privatestaticintTestInt1=0;

    privatestaticintTestInt2 = 0;

    privatestaticobjectlocko =newobject();

    staticvoidMain(string[] args)

    {

      Console.WriteLine("System.Timers.Timer 回调方法重入测试:");

      TimersTimerReenter();

      //这里确保已经开始的回调方法有机会结束

      System.Threading.Thread.Sleep(2 * 1000);

      Console.WriteLine("System.Threading.Timer 回调方法重入测试:");

      ThreadingTimerReenter();

      Console.Read();

    }

    ///


    /// 展示System.Timers.Timer的回调方法重入

    ///

    staticvoidTimersTimerReenter()

    {

      System.Timers.Timer timer =newSystem.Timers.Timer();

      timer.Interval = 100;   //100毫秒

      timer.Elapsed += TimersTimerHandler;

      timer.Start();

      System.Threading.Thread.Sleep(2 * 1000);//运行2秒

      timer.Stop();

    }

    ///


    /// 展示System.Threading.Timer的回调方法重入

    ///

    staticvoidThreadingTimerReenter()

    {

      //100毫秒

      using(System.Threading.Timer timer =newSystem.Threading.Timer

       (newSystem.Threading.TimerCallback(ThreadingTimerHandler),null, 0, 100))

      {

        System.Threading.Thread.Sleep(2 * 1000);//运行2秒

      }

    }

    ///


    /// System.Timers.Timer的回调方法

    ///

    ///

    ///

    privatestaticvoidTimersTimerHandler(objectsender,EventArgs args)

    {

      lock(locko)

      {

        Console.WriteLine("测试整数:"+ TestInt1.ToString());

        //睡眠10秒,保证方法重入

        System.Threading.Thread.Sleep(300);

        TestInt1++;

        Console.WriteLine("自增1后测试整数:"+ TestInt1.ToString());

      }

    }

    ///


    /// System.Threading.Timer的回调方法

    ///

    ///

    privatestaticvoidThreadingTimerHandler(objectstate)

    {

      lock(locko)

      {

        Console.WriteLine("测试整数:"+ TestInt2.ToString());

        //睡眠10秒,保证方法重入

        System.Threading.Thread.Sleep(300);

        TestInt2++;

        Console.WriteLine("自增1后测试整数:"+ TestInt2.ToString());

      }

    }

  }

}

 

相关文章

精彩推荐