我需要一个来自asp.net应用程序的后台长时间运行的线程。 顺便说一句,该方法从外部数据源时段获取内容并可能发生异常,我提供了一些方法来完成此任务,请建议哪种方式最好,如果有更好的方法请咨询。
Way1 =异常发生时循环。
name
Way2 =通过计时器之类的方式运行以下方法周期,并在发生异常时打开新线程。
static void LongRunningMethod()
{
do
{
try
{
//fetch something from external period and maybe exception happens.
Thread.sleep(100000);
}
catch(Exception ex)
{
//log exception..
}
} while (true);
}
Way3 =异常发生时调用自身。
static void LongRunningMethod()
{
try
{
//fetch something from external period and maybe exception happens.
Thread.sleep(100000);
}
catch(Exception ex)
{
//log exception..
Thread T2 = new Thread(LongRunningMethod);
T2.Start();
}
}
答案 0 :(得分:1)
我将不使用这三者中的任何一个。实际上,我很少基于ASP.NET构建间隔任务,因为:
<强> 1。任务的开始失控
基于ASP.NET,必须在Application_Start
方法上启动/注册任务,该方法由第一个请求触发,这意味着您的任务在第一个请求到来时启动。从理论上讲,部署应用程序后可能需要很长时间。
<强> 2。任务结束失控
Web服务器(思维IIS)可以配置为按需循环(AFAIK这是默认行为)。也就是说,您的线程可能在执行时被杀死。在大多数情况下,您需要处理任务和状态的持久性,并添加重试代码等......这真是一场噩梦!
对我而言,使用Windows服务或Windows的任务调度程序功能更好,后者更容易,因为您不需要编写计时器或间隔调用代码。它在事件查看器中更稳定,代码更少,日志更友好!这真的让一切变得更轻松。
答案 1 :(得分:0)
我喜欢使用System.ComponentModel.BackgroundWorker:
static BackgroundWorker looper = new BackgroundWorker();
static bool isRunning = true;//you can set this to false when closing
public static void initialize(){
looper.DoWork+= doLoop;
looper.RunRunWorkerAsync();
}
private static void doLoop(object sender, DoWorkEventArgs e){
while(isRunning){
//do looping code
System.Threading.Thread.Sleep(5000);
if(!isRunning)
break;
}
}
PS - 抱歉奇怪的间距 - 我在代码窗口直接编辑了这个。