Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net中执行预定的后台工作_C#_.net_Asp.net_Multithreading - Fatal编程技术网

C# 在asp.net中执行预定的后台工作

C# 在asp.net中执行预定的后台工作,c#,.net,asp.net,multithreading,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

我需要在我的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缓存黑客完成的:

您可以将类用于这样的任务。我在自己的ASP.NET聊天模块中使用这个类来关闭过期时间后的聊天室,它运行良好。 我想,这是

以下示例代码:

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();
            }

        }
    }
}
您可以将类用于这样的任务。我在自己的ASP.NET聊天模块中使用这个类来关闭过期时间后的聊天室,它运行良好。 我想,这是

以下示例代码:

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();
            }

        }
    }
}

你们的方法会奏效,但正如卢卡斯所说的,更好的方法将会被使用

除此之外,如果您拥有运行站点的计算机,我建议您在计划任务时使用Windows服务。这种方法将证明自己比asp.net基础结构中的任何类型的计时器都更有益。这是因为在asp.net中工作的所有内容都将由asp.net引擎管理,而这不是您想要的。例如,工作进程可以循环使用,此时您的任务将中断

有关windows服务中计时器的详细信息可在此处找到:

有关windows服务的信息可在此处找到:


要将计时器输入windows服务,您需要在启动时创建它并处理它触发的事件。

您的方法会起作用,但正如Lucasus所说,将使用更好的方法

除此之外,如果您拥有运行站点的计算机,我建议您在计划任务时使用Windows服务。这种方法将证明自己比asp.net基础结构中的任何类型的计时器都更有益。这是因为在asp.net中工作的所有内容都将由asp.net引擎管理,而这不是您想要的。例如,工作进程可以循环使用,此时您的任务将中断

有关windows服务中计时器的详细信息可在此处找到:

有关windows服务的信息可在此处找到:


要将计时器输入windows服务,您需要在启动时创建它并处理它触发的事件。

如果要执行计划的工作,为什么不使用windows任务计划程序

我找到的一些信息可能有用:


Kris

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

我找到的一些信息可能有用:


Kris

使用计时器,我仍然必须执行
ThreadPool.QueueUserWorkItem(o=>Work())?不同之处在于我不再需要while(true)Thread.sleep?使用计时器,我仍然必须执行
ThreadPool.QueueUserWorkItem(o=>Work())?不同之处在于我不再需要while(true)Thread.sleep?使用计时器,我仍然必须执行
ThreadPool.QueueUserWorkItem(o=>Work())?区别在于我不再需要while(真的)Thread.sleep了?@Chuck,是的,你不需要这些东西。现在查看我的帖子,我已经编写了一些示例代码,这些代码完全符合您的要求,但是使用了计时器approach@Chuck,工作方法永远不会执行,因为程序会立即退出。程序退出后,将释放计时器对象并停止计时器线程。我编辑了这个程序-在“Worker.Start()”之后添加了Thread.Sleep(2000)。现在Work函数有足够的时间执行。使用计时器,我仍然必须执行
ThreadPool.QueueUserWorkItem(o=>Work())?区别在于我不再需要while(真的)Thread.sleep了?@Chuck,是的,你不需要这些东西。现在查看我的帖子,我已经编写了一些示例代码,这些代码完全符合您的要求,但是使用了计时器approach@Chuck,工作方法永远不会执行,因为程序会立即退出。程序退出后,将释放计时器对象并停止计时器线程。我编辑了这个程序-在“Worker.Start()”之后添加了Thread.Sleep(2000)。现在Work函数有足够的时间执行。