线程在IIS上托管的WCF应用程序中随机停止

时间:2015-04-16 10:53:31

标签: c# multithreading wcf iis

根据客户要求,我实现了一个C#WCF Web服务,在每次调用时启动一个执行自己异步处理的线程。线程启动后,无论线程处理状态如何,Web服务都会正常结束执行。

我遇到的问题是,有时(并非总是)线程会随机中断,没有任何异常。中断发生在不同的时间点和不同的时间,因此我无法确定其故障中的常数。

我报告启动该帖子的服务代码。

//WCF starts
....
//Starts a new thread
System.Threading.ThreadPool.QueueUserWorkItem(th =>
{

    ThreadContext.Properties["property1"] = prop1;

    // The class to be executed by the thread
    ExecutionClass executionClass= new ExecutionClass();

    Logger.log("start elaboration");       

    executionClass.start(parameter);
});
....
// the WCF returns the response independently of thread execution
return response;

可能是Windows或IIS导致线程结束?我可以做些什么来解决这个问题吗?

P.S。 我知道这不是一个很好的解决方案,但是要求是由客户强加的。

3 个答案:

答案 0 :(得分:2)

您的代码无法启动新的Thread。它确实启动了一个新的unit-of-work,因此ThreadPool可以在已经创建的线程中运行你的工作 如果您开始Task而不是UserWorkItem,您的客户会满意吗?您可以在默认的ThreadPool中运行它,因此您的应用程序的行为将完全相同,但您可以轻松地附加到异常处理的任务的继续,因此您将始终了解未完成的任务代码中的任务。 你甚至可以为ThreadPool提供一个标志,这个任务将是一个长期运行的标志,所以这将减少线程的杀戮。

Run method

Task.Factory.Run(() =>
{
    ThreadContext.Properties["property1"] = prop1;

    // The class to be executed by the thread
    ExecutionClass executionClass= new ExecutionClass();

    Logger.log("start elaboration");       

    executionClass.start(parameter);
// TaskScheduler.Default is used by default to run your code in ThreadPool
})
// handle the thread aborting appropriately
.ContinueWith(t =>  
  HandleException(task.Exception),
  // no code if task is success or canceled
  TaskContinuationOptions.OnlyOnFaulted);

StartNew method LongRunning参数:

Task.Factory.StartNew(() =>
{
    ThreadContext.Properties["property1"] = prop1;

    // The class to be executed by the thread
    ExecutionClass executionClass= new ExecutionClass();

    Logger.log("start elaboration");       

    executionClass.start(parameter);

}
// as you don't interested in the task's future, you don't need any cancellation token
, CancellationToken.None
// provide the long running parameter
, TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning
// provide TaskScheduler.Default to run your code in the ThreadPool
, TaskScheduler.Default);)
// handle the thread aborting appropriately
.ContinueWith(t =>  
  HandleException(task.Exception),
  // no code if task is success or canceled
  TaskContinuationOptions.OnlyOnFaulted);

所以链接相关:

答案 1 :(得分:1)

查看您网站的应用程序池(在IIS中)。有许多设置会影响线程的生命周期。

答案 2 :(得分:1)

感谢大家的建议!

最后,我得出了问题的原因:当我的Web服务调用其他Web服务时,如果它等待太长时间,那么该线程会被IIS杀死。

在我的情况下,原因是系统工程师在IIS上设置了超时值,如果应用程序处于等待状态超过120秒,则会释放内存。

不幸的是,他们无法改变价值,但现在我有了问题的证据,所以我现在可以自由地改变架构。