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

话不多说,请看代码:

using System;
using System.Collections.Generic;
using System.Text;
namespace NET.MST.Sixth.Reenter
{
  class Reenter
  {
    //用来造成线程同步问题的静态成员
    private static int TestInt1=0;
    private static int TestInt2 = 0;
    private static object locko = new object();
    static void Main(string[] args)
    {
      Console.WriteLine("System.Timers.Timer 回调方法重入测试:");
      TimersTimerReenter();
      //这里确保已经开始的回调方法有机会结束
      System.Threading.Thread.Sleep(2 * 1000);
      Console.WriteLine("System.Threading.Timer 回调方法重入测试:");
      ThreadingTimerReenter();
      Console.Read();
    }
    /// <summary>
    /// 展示System.Timers.Timer的回调方法重入
    /// </summary>
    static void TimersTimerReenter()
    {
      System.Timers.Timer timer = new System.Timers.Timer();
      timer.Interval = 100;    //100毫秒
      timer.Elapsed += TimersTimerHandler;
      timer.Start();
      System.Threading.Thread.Sleep(2 * 1000); //运行2秒
      timer.Stop();
    }
    /// <summary>
    /// 展示System.Threading.Timer的回调方法重入
    /// </summary>
    static void ThreadingTimerReenter()
    {
      //100毫秒
      using (System.Threading.Timer timer = new System.Threading.Timer
       (new System.Threading.TimerCallback(ThreadingTimerHandler), null, 0, 100))
      {
        System.Threading.Thread.Sleep(2 * 1000); //运行2秒
      }
    }
    /// <summary>
    /// System.Timers.Timer的回调方法
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="args"></param>
    private static void TimersTimerHandler(object sender,EventArgs args)
    {
      lock (locko)
      {
        Console.WriteLine("测试整数:" + TestInt1.ToString());
        //睡眠10秒,保证方法重入
        System.Threading.Thread.Sleep(300);
        TestInt1++;
        Console.WriteLine("自增1后测试整数:" + TestInt1.ToString());
      }
    }
    /// <summary>
    /// System.Threading.Timer的回调方法
    /// </summary>
    /// <param name="state"></param>
    private static void ThreadingTimerHandler(object state)
    {
      lock (locko)
      {
        Console.WriteLine("测试整数:" + TestInt2.ToString());
        //睡眠10秒,保证方法重入
        System.Threading.Thread.Sleep(300);
        TestInt2++;
        Console.WriteLine("自增1后测试整数:" + TestInt2.ToString());
      }
    }
  }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • asp.net中Timer无刷新定时器的实现方法

    本文实例讲述了asp.net中Timer无刷新定时器的实现方法.Timer控件要实现无刷新,得用到ajax技术,这里使用VS2008自带的ajax技术.    首先得添加一个ScriptManager控件,然后再添加一个UpdatePanel用于存放Timer控件内容的,就可以实现无刷新了.下面是详细的内容: 一.前台代码如下: <form id="form1" runat="server"> <asp:ScriptManager ID="

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

    话不多说,请看代码: using System; using System.Collections.Generic; using System.Text; namespace NET.MST.Sixth.Reenter { class Reenter { //用来造成线程同步问题的静态成员 private static int TestInt1=0; private static int TestInt2 = 0; private static object locko = new object

  • C#中Timer使用及解决重入问题

    ★前言 打开久违的Live Writer,又已经好久没写博客了,真的太懒了.废话不多说了,直接进入这次博客的主题--Timer.为什么要写这个呢,因为前几天应朋友之邀,想做个"黑客"小工具,功能挺简单就是自动获取剪贴板的内容然后发送邮件,就需要用到Timer来循环获取剪贴板的内容,但是由于到了发送邮件这个功能,使用C#的SmtpClient始终发送不了邮件,以前写过类似发邮件的功能,当时可以用网易的,现在也不能用了,不知道咋回事,只好作罢.在使用Timer中遇到了之前没有想过的问题--

  • Golang教程之不可重入函数的实现方法

    函数function Go函数不支持嵌套.重载和默认参数 但支持以下特性: 无需声明原型 不定长度变参 多返回值 命名返回值参数 匿名函数 闭包 前言 一个不可重入的函数就是一个在任何时间点只能执行一次的函数,不管它被调用了多少次,以及有多少goroutines. 本篇文章说明了阻塞不可重入函数,并在golang中产生不可重入的函数实现. 场景用例 某个服务是对某些条件进行轮询,每秒监视一些状态.我们希望每个状态都可以独立地检查,而不需要阻塞.实现可能是这样的: func main() { ti

  • jquery.Ajax()方法调用Asp.Net后台的方法解析

    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法.先来个简单的实例热热身吧. 1.无参数的方法调用asp.net code: 复制代码 代码如下: using System.Web.Script.Services; [WebMethod]   public static string SayHello()   {        return "Hello Ajax!";   }  using System.Web.Script.Services; [WebMe

  • Java并发编程之重入锁与读写锁

    重入锁 重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁.重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞,该特性的实现需要解决以下两个问题. 1.线程再次获取锁.锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取. 2.锁的最终释放.线程重复n次获取了锁,随后在第n次释放该锁后,其他线程能够获取到该锁.锁的最终释放要求锁对于获取进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,计数自减,当计数等于0时表示锁已经成功释放

  • 举例讲解Python中的死锁、可重入锁和互斥锁

    一.死锁 简单来说,死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁,这里结合例子说明下两种常见的死锁情况. 1.迭代死锁 该情况是一个线程"迭代"请求同一个资源,直接就会造成死锁: import threading import time class MyThread(threading.Thread): def run(self): global num time.sleep(1) if mutex.acquire(1): num = num+1 msg = se

  • java synchronized加载加锁-线程可重入详解及实例代码

    java synchronized加载加锁-线程可重入 实例代码: public class ReGetLock implements Runnable { @Override public void run() { get(); } public synchronized void get() { System.out.println(Thread.currentThread().getId()); set(); } public synchronized void set() { Syste

  • Java源码解析之可重入锁ReentrantLock

    本文基于jdk1.8进行分析. ReentrantLock是一个可重入锁,在ConcurrentHashMap中使用了ReentrantLock. 首先看一下源码中对ReentrantLock的介绍.如下图.ReentrantLock是一个可重入的排他锁,它和synchronized的方法和代码有着相同的行为和语义,但有更多的功能.ReentrantLock是被最后一个成功lock锁并且还没有unlock的线程拥有着.如果锁没有被别的线程拥有,那么一个线程调用lock方法,就会成功获取锁并返回.

  • Java可重入锁的实现原理与应用场景

    可重入锁,从字面来理解,就是可以重复进入的锁. 可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响. 在JAVA环境下ReentrantLock和synchronized都是可重入锁. synchronized是一个可重入锁.在一个类中,如果synchronized方法1调用了synchronized方法2,方法2是可以正常执行的,这说明synchronized是可重入锁.否则,在执行方法2想获取锁的时候,该锁已经在执行方法1时获取了,那么方法

  • 教你完全理解ReentrantLock重入锁

    1. ReentrantLock的介绍 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞.在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),synchronized通过获取自增,释放自减的方式实现重入.与此同时,ReentrantLock还支持公平锁和非公平锁两种方式. 那么,要想完完全全的弄懂ReentrantL

随机推荐