如何每隔一段时间就自动执行一段代码(比如调用一个函数)

时间:2022-08-20 15:55:26
比如,我想每隔5分钟就把DataSet里更新的数据存储到数据库。
我感觉好像应该用Timer,但具体怎么用不解。尤其是在Asp.net并发环境下……
能给点示例代码更好。

13 个解决方案

#1


使用异步调用 等LX来贴代码

#2


我知道Ajax里从传送数据要用异步传输,
  var xHRObject = false;
    if (window.XMLHttpRequest)
    {
        xHRObject = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        xHRObject = new ActiveXObject("Microsoft.XMLHTTP");
    }
  
    function getData()
    {
        //Check to see if the XMlHttpRequest object is ready and whether it has  
        //returned a legitmate response
        if (xHRObject.readyState == 4 && xHRObject.status == 200)
        {           
            var xmlDoc = xHRObject.responseXML;
            if (window.ActiveXObject)
            { 
                //Load XSL
                var xsl = new ActiveXObject("Microsoft.XMLDOM");
                xsl.async = false;
                xsl.load("MenuDisplay.xsl");
       
                //Transform
                var transform = xmlDoc.transformNode(xsl);
                var spanb = document.getElementById("menuhere");

            }
            
            else
            {
              var xsltProcessor = new XSLTProcessor();
              
              //Load XSL
              XObject = new XMLHttpRequest();
              XObject.open("GET", "MenuDisplay.xsl", false);
              XObject.send(null);
              
              xslStylesheet = XObject.responseXML;
              xsltProcessor.importStylesheet(xslStylesheet);
              
              //Transform
              var fragment = xsltProcessor.transformToFragment(xmlDoc, document);

                document.getElementById("menuhere").innerHTML = "";
                document.getElementById("menuhere").appendChild(fragment);   
           
           
            }

                //Display results of transform
                if (spanb != null)
                {
                    spanb.innerHTML = transform; 
                }

                //Clear the object and call the getDocument function in 10 seconds
                //此乃注册getDocument()方法,10秒一次。
                xHRObject.abort();
                setTimeout("getDocument()", 10000);     
            }  
    }      
    
    function getDocument()
    {
     //Reset the function
     xHRObject.onreadystatechange = getData;
     
     //IE will cache the GET request the only way around this is to append a   
     //different querystring. We add a new date and append it as a querystring
     xHRObject.open("GET", "SuiteList.xml?id=" + Number(new Date), true);
     
     xHRObject.send(null);
     }
     

C#里的类似,代码一时找不到

#3


技术菜鸟,只知道这些了

#4


在Global文件的Application_Start事件中加入定时器,我实际使用的部分代码如下:
public static local.dsnews mynews = null;

protected void Application_Start(object sender, EventArgs e)
{
mynews = new local.dsnews();
}


namespace forexds.local
{
public class dsnews
{
private const int Interval = 4 * 60 * 1000;// 定时4分钟
private DataTable dtNews = null;
private ArrayList rsslist = new ArrayList();

public dsnews()
{
HData data = null;
try
{
data = new HData();
dtNews = data.GetTable("select * from news");
}
catch (Exception ex)
{
HLog.writeLog("dsnews_dsnews: " + ex.Message);
}
finally
{
if (data != null)
data.Dispose();
}

initsource();

System.Timers.Timer timernews = new System.Timers.Timer();
timernews.Interval = Interval;
timernews.AutoReset = true;
timernews.Enabled = true;
timernews.Elapsed += new System.Timers.ElapsedEventHandler(updateTable);
updateTable(null, null);

}


如果没有Global文件的话,在项目上点右键加之。

#5


用ajax

#6


使用ajax.dll或者ajaxpro.dll或其它的
function getDocument()
{
pagename.functionServer();
setTimeout("getDocument()", 5*60*1000);  
}   

#7


拒说timer会刷新,体验不是太好。ajax.dll的例子可以网上找找,或者看我博客里的那个前台调用后台方法的文章!

#8


ajax是个好方案,但要注意它要客户端浏览器来发出请求,也就是说如果客户端没有访问你的发送请求的页面,你的代码是不会被执行的。写在global中一定会执行,但它是影响全局的。
具体情况看你的需求了。
#2楼,GET可能会遇到“查询字符串过长”的问题,还是POST吧。。。

#9


可能是我没说清楚。

和AJAX完全没有关系,我根本用不到前台。我就在后台的程序里,比如BLL层,程序 自动的每隔一段时间执行一段代码即可。

#10


引用 4 楼 hhhh63 的回复:
在Global文件的Application_Start事件中加入定时器,我实际使用的部分代码如下:
public static local.dsnews mynews = null;

protected void Application_Start(object sender, EventArgs e)
{
mynews = new local.dsnews();
}

n……


这应该是我想要的,但System.Timers.Timer timernews = new System.Timers.Timer();不行啊,根本就没有不带参数的重载?

另外比如说我希望的不是在程序开始就开始计时,而是在 第一次调用某方法之后,我怎么写,像这样:

    public class TimesTest
    {
        static System.Threading.Timer timer;
        public static void TriggerTimes(object o)
        {
            if (timer==null)
            {
                timer = new System.Threading.Timer(ShowResult,null,0,5*1000);
            }
        }

        private static void ShowResult(object o)
        {
            Console.WriteLine(DateTime.Now);
        }
    }

这种写法,是不是会有多线程方面的问题,而且我总感觉这样写很怪。

#11


学习了

#12


没人知道么?

#13


再顶一下,没人就结贴了

#1


使用异步调用 等LX来贴代码

#2


我知道Ajax里从传送数据要用异步传输,
  var xHRObject = false;
    if (window.XMLHttpRequest)
    {
        xHRObject = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        xHRObject = new ActiveXObject("Microsoft.XMLHTTP");
    }
  
    function getData()
    {
        //Check to see if the XMlHttpRequest object is ready and whether it has  
        //returned a legitmate response
        if (xHRObject.readyState == 4 && xHRObject.status == 200)
        {           
            var xmlDoc = xHRObject.responseXML;
            if (window.ActiveXObject)
            { 
                //Load XSL
                var xsl = new ActiveXObject("Microsoft.XMLDOM");
                xsl.async = false;
                xsl.load("MenuDisplay.xsl");
       
                //Transform
                var transform = xmlDoc.transformNode(xsl);
                var spanb = document.getElementById("menuhere");

            }
            
            else
            {
              var xsltProcessor = new XSLTProcessor();
              
              //Load XSL
              XObject = new XMLHttpRequest();
              XObject.open("GET", "MenuDisplay.xsl", false);
              XObject.send(null);
              
              xslStylesheet = XObject.responseXML;
              xsltProcessor.importStylesheet(xslStylesheet);
              
              //Transform
              var fragment = xsltProcessor.transformToFragment(xmlDoc, document);

                document.getElementById("menuhere").innerHTML = "";
                document.getElementById("menuhere").appendChild(fragment);   
           
           
            }

                //Display results of transform
                if (spanb != null)
                {
                    spanb.innerHTML = transform; 
                }

                //Clear the object and call the getDocument function in 10 seconds
                //此乃注册getDocument()方法,10秒一次。
                xHRObject.abort();
                setTimeout("getDocument()", 10000);     
            }  
    }      
    
    function getDocument()
    {
     //Reset the function
     xHRObject.onreadystatechange = getData;
     
     //IE will cache the GET request the only way around this is to append a   
     //different querystring. We add a new date and append it as a querystring
     xHRObject.open("GET", "SuiteList.xml?id=" + Number(new Date), true);
     
     xHRObject.send(null);
     }
     

C#里的类似,代码一时找不到

#3


技术菜鸟,只知道这些了

#4


在Global文件的Application_Start事件中加入定时器,我实际使用的部分代码如下:
public static local.dsnews mynews = null;

protected void Application_Start(object sender, EventArgs e)
{
mynews = new local.dsnews();
}


namespace forexds.local
{
public class dsnews
{
private const int Interval = 4 * 60 * 1000;// 定时4分钟
private DataTable dtNews = null;
private ArrayList rsslist = new ArrayList();

public dsnews()
{
HData data = null;
try
{
data = new HData();
dtNews = data.GetTable("select * from news");
}
catch (Exception ex)
{
HLog.writeLog("dsnews_dsnews: " + ex.Message);
}
finally
{
if (data != null)
data.Dispose();
}

initsource();

System.Timers.Timer timernews = new System.Timers.Timer();
timernews.Interval = Interval;
timernews.AutoReset = true;
timernews.Enabled = true;
timernews.Elapsed += new System.Timers.ElapsedEventHandler(updateTable);
updateTable(null, null);

}


如果没有Global文件的话,在项目上点右键加之。

#5


用ajax

#6


使用ajax.dll或者ajaxpro.dll或其它的
function getDocument()
{
pagename.functionServer();
setTimeout("getDocument()", 5*60*1000);  
}   

#7


拒说timer会刷新,体验不是太好。ajax.dll的例子可以网上找找,或者看我博客里的那个前台调用后台方法的文章!

#8


ajax是个好方案,但要注意它要客户端浏览器来发出请求,也就是说如果客户端没有访问你的发送请求的页面,你的代码是不会被执行的。写在global中一定会执行,但它是影响全局的。
具体情况看你的需求了。
#2楼,GET可能会遇到“查询字符串过长”的问题,还是POST吧。。。

#9


可能是我没说清楚。

和AJAX完全没有关系,我根本用不到前台。我就在后台的程序里,比如BLL层,程序 自动的每隔一段时间执行一段代码即可。

#10


引用 4 楼 hhhh63 的回复:
在Global文件的Application_Start事件中加入定时器,我实际使用的部分代码如下:
public static local.dsnews mynews = null;

protected void Application_Start(object sender, EventArgs e)
{
mynews = new local.dsnews();
}

n……


这应该是我想要的,但System.Timers.Timer timernews = new System.Timers.Timer();不行啊,根本就没有不带参数的重载?

另外比如说我希望的不是在程序开始就开始计时,而是在 第一次调用某方法之后,我怎么写,像这样:

    public class TimesTest
    {
        static System.Threading.Timer timer;
        public static void TriggerTimes(object o)
        {
            if (timer==null)
            {
                timer = new System.Threading.Timer(ShowResult,null,0,5*1000);
            }
        }

        private static void ShowResult(object o)
        {
            Console.WriteLine(DateTime.Now);
        }
    }

这种写法,是不是会有多线程方面的问题,而且我总感觉这样写很怪。

#11


学习了

#12


没人知道么?

#13


再顶一下,没人就结贴了