ASP.NET中的线程超时问题

时间:2011-02-04 12:42:27

标签: .net asp.net multithreading .net-3.5

在我的网站中,我使用一个线程在后台执行一个过程。我点击按钮启动线程。

现在我遇到的问题是它似乎超时并停止了。基本上它会停止更新数据库。

可能出现什么问题?

这是我的代码:

 public static class BackgroundHelper 
 {
    private static readonly object _syncRoot = new object(); 
    private static readonly ManualResetEvent _event = new ManualResetEvent(false); 
    private static Thread _thread;
    public static bool Running 
    { 
        get; 
        private set;
    }
    public static void Start()
    {    
        lock (_syncRoot) 
        {
          if (Running)
                return; 
            Running = true;
            // Reset the event so we can use it to stop the thread.
            _event.Reset(); 
            // Star the background thread.
            _thread = new Thread(new ThreadStart(BackgroundProcess)); 
            _thread.Start();
        }
    }

    public static void Stop()   
    {
        lock (_syncRoot)
        {
            if (!Running)
                return;
            Running = false; 
            // Signal the thread to stop.
            _event.Set();
            // Wait for the thread to have stopped.
            _thread.Join(); 
            _thread = null;
        } 
    }   

    private static void BackgroundProcess()  
    { 
        int count = 0;
        DateTime date1 = new DateTime(2011, 2, 5);
        while (System.DateTime.Compare(System.DateTime.Now, date1) < 0)
        {
            downloadAndParse();  
            // Wait for the event to be set with a maximum of the timeout. The
            // timeout is used to pace the calls to downloadAndParse so that 
            // it not goes to 100% when there is nothing to download and parse.
            bool result = _event.WaitOne(TimeSpan.FromSeconds(45));
            // If the event was set, we're done processing.
           // if (result)
             //   break;
            count++; 
        }
    }

    private static void downloadAndParse()
    {
        NewHive.MyServ newServe = new NewHive.MyServ();
        NewHive.CsvDownload newService = new NewHive.CsvDownload();
        //NewHive.MyServ newServe = new NewHive.MyServ();
        string downloadSuccess = newService.CsvDownloader();
        if (downloadSuccess == "Success")
        {
            string parseSuccess = newService.CsvParser();

        }
        newServe.updateOthersInPosition();
    }
}

1 个答案:

答案 0 :(得分:2)

后台线程只有在调用它的线程处于活动状态时才能生存。由于Web服务器具有有限的请求/响应生命周期,因此您的后台进程不能超过此时间限制。一旦在Web服务器上达到超时,服务器将生成响应(超时),将其推送到客户端并停止线程。这个事件会杀死你的后台线程,所以如果它在数据库的中期更新它就会停止。如果您正在执行写入文件之类的操作,则会使该文件保持打开状态,锁定状态并且编写不正确(需要重新启动才能重新访问已损坏的文件)。