问题是即使我将线程设置为“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);
}
}
}
答案 0 :(得分:2)
IIS不够稳定,无法运行长时间运行的进程。它专为请求 - 响应类型交互而设计。
如果您需要长时间运行某些内容,请在Windows服务中运行它。您可以使用远程处理或消息队列从Web服务启动它。
答案 1 :(得分:0)
您可以做的一件事是挂钩Application_End
事件。在最坏的情况下,您可以记录需要完成哪些线程,并且最多可以设置某种延迟,使应用程序保持活动状态直到线程完成。