我需要一个永远运行的线程。哪种方法最好?

时间:2016-08-29 02:05:24

标签: c# asp.net multithreading

我需要一个来自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();
            }

    } 

2 个答案:

答案 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 - 抱歉奇怪的间距 - 我在代码窗口直接编辑了这个。