在asp.net做预定的后台工作

时间:2011-10-04 08:44:44

标签: c# .net asp.net multithreading

我需要在我的asp.net应用程序中定期执行某项任务,所以这样做:

protected void Application_Start()
{
    Worker.Start();
}

...
 public static class Worker
 {
   public static void Start()
   {
     ThreadPool.QueueUserWorkItem(o => Work());
   }
   public static void Work()
   {
      while (true)
      {
          Thread.Sleep(1200000);
          //do stuff
      }
    }
}

这种做法好吗?

我看到一个关于在这个网站上授予徽章的博客是使用asp.net缓存黑客完成的: http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

3 个答案:

答案 0 :(得分:2)

您可以使用Timer课程来执行此类任务。我在我自己的ASP.NET聊天模块中使用这个类在一些过期时间之后关闭房间并且它工作正常。 我认为,这是better approach than using Thread.Sleep

以下示例代码:

using System;
using System.IO;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Worker.Start();
            Thread.Sleep(2000);
        }

        public static class Worker
        {
            private static Timer timer;

            public static void Start()
            {
                //Work(new object());
                int period = 1000;
                timer = new Timer(new TimerCallback(Work), null, period, period);
            }

            public static void Work(object stateInfo)
            {
                TextWriter tw = new StreamWriter(@"w:\date.txt");

                // write a line of text to the file
                tw.WriteLine(DateTime.Now);

                // close the stream
                tw.Close();
            }

        }
    }
}

答案 1 :(得分:2)

你的方法会奏效,但正如卢卡斯所说,更好的方法是使用Timer class

除此之外,如果您拥有运行网站的计算机,我建议您使用Windows服务进行计划任务。这种方法本身比asp.net基础设施中的任何类型的计时器都更有益。这是因为在asp.net内部工作的所有内容都将由asp.net引擎管理,而这不是你想要的。例如,工作流程可以回收,此时您的任务将会中断。

有关Windows服务中计时器的详细信息,请访问:Timers and windows services

有关Windows服务的信息,请访问:Windows services

要将计时器安装到Windows服务中,您需要在开始时创建它并处理它触发的事件。

答案 2 :(得分:1)

如果您想进行预定的工作,为什么不使用Windows任务计划程序?

我发现的一些信息可能很有用:http://www.codeproject.com/KB/cs/tsnewlib.aspx

克里斯