2011-10-04 59 views
0

我需要在我的asp.net應用程序定期執行特定任務也一樣是這樣的:做預定的後臺工作在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/

回答

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

     } 
    } 
} 
+0

與定時器我還要做'ThreadPool.QueueUserWorkItem(O =>工作());'?不同的是,我不需要while(true)Thread.sleep了嗎? – Omu

+0

@抓,是的,你不需要這個東西。現在檢查我的帖子,我已經寫了正在做什麼的示例代碼,但是使用Timer方法 –

+0

我嘗試了代碼,工作方法從未得到執行 – Omu

2

你的方法將工作,但作爲Lucasus說,更好的辦法將使用Timer class

除此之外,如果您擁有您的網站正在運行的計算機,我會建議使用Windows服務進行您的計劃任務。這種方法比asp.net基礎設施中的任何類型的定時器都更有效。這是因爲在asp.net中工作的所有內容都將由asp.net引擎管理,並且它不是您想要的內容。例如,工作進程可以被回收,並且此時您的任務將會中斷。

有關Windows服務中定時器的詳細信息可以在這裏找到:Timers and windows services

有關Windows服務的信息可以在這裏找到:Windows services

要hoock計時器到Windows服務,您需要在開始創建和處理,它觸發事件。

+0

與計時器我仍然必須做'ThreadPool.QueueUserWorkItem(o =>工作());'?不同的是,我不需要while(true)Thread.sleep了嗎? – Omu