IIS认为webservice是空闲的

时间:2011-02-08 22:24:39

标签: .net multithreading web-services iis

问题是即使我将线程设置为“thrd.IsBackground = false”,即使这是一个长时间运行的进程,iis也不认为它正在运行。如果我没有关闭应用程序池的空闲关闭,它将关闭,因为它认为它是空闲的。如果我部署新版本,它会中止所有正在运行的线程,而不是在重新命名和使用新代码之前等待所有进程的真正空闲。我在这做错了什么? 这是我的网络服务代码:

  /// <summary>
    /// Summary description for LetterInitiateWS
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class LetterInitiateWS : System.Web.Services.WebService
    {

        private static Processor processor = new Processor();
        [WebMethod]
        public void ExecuteBulkRun()
        {
            var thrd = new Thread(() => ThreadExecuteBulkRun());
            thrd.IsBackground = false;
            thrd.Start();

        }

        [WebMethod]
        public void ExecuteTemplateBulkRun(string templateCategory, string TemplateType)
        {
            var thrd = new Thread(() => ThreadExecuteTemplateBulkRun(templateCategory, TemplateType));
            thrd.IsBackground = false;
            thrd.Start();

        }

        private void ThreadExecuteBulkRun()
        {
            processor.ExecuteBulkRun();
        }
        private void ThreadExecuteTemplateBulkRun(string templateCategory, string TemplateType)
        {
            processor.ExecuteTemplateBulkRun(templateCategory, TemplateType);
        }

    }
}

2 个答案:

答案 0 :(得分:2)

IIS不够稳定,无法运行长时间运行的进程。它专为请求 - 响应类型交互而设计。

如果您需要长时间运行某些内容,请在Windows服务中运行它。您可以使用远程处理或消息队列从Web服务启动它。

答案 1 :(得分:0)

您可以做的一件事是挂钩Application_End事件。在最坏的情况下,您可以记录需要完成哪些线程,并且最多可以设置某种延迟,使应用程序保持活动状态直到线程完成。