【发布时间】:2011-02-08 22:24:38
【问题描述】:
问题是即使我将线程设置为“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);
}
}
}
【问题讨论】:
-
是否可以选择使用 WCF?我已经成功地使用 WCF 运行后台线程而没有 IIS 超时。我使用一个 ServiceHostFactory 来启动后台线程来定期执行代码。
-
不,我需要使用 web 服务,因为我是从 sql 作业调用它的方式
-
当您部署一个新版本时,您会强制 AppDomain 卸载它将中止所有活动线程。无法回避这个事实。您可以在某处创建一个锁,以允许现有线程完成并拒绝新请求。完成所有线程后,您就可以升级了。我认为,但不知道,空闲超时是基于最后一个请求,而不是服务器在做什么,所以我不知道如何帮助你。
-
如果您将处理器放入 Application["processor"] 并为线程执行相同操作,会有帮助,因此有一个应用程序范围的线程列表。 webservice 实现超出范围这一事实可能也会破坏所有本地引用
-
rene,这很有趣。我不确定如何实现它
标签: .net multithreading web-services iis