根据客户要求,我实现了一个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。 我知道这不是一个很好的解决方案,但是要求是由客户强加的。
答案 0 :(得分:2)
您的代码无法启动新的Thread
。它确实启动了一个新的unit-of-work
,因此ThreadPool可以在已经创建的线程中运行你的工作
如果您开始Task
而不是UserWorkItem
,您的客户会满意吗?您可以在默认的ThreadPool
中运行它,因此您的应用程序的行为将完全相同,但您可以轻松地附加到异常处理的任务的继续,因此您将始终了解未完成的任务代码中的任务。
你甚至可以为ThreadPool
提供一个标志,这个任务将是一个长期运行的标志,所以这将减少线程的杀戮。
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秒,则会释放内存。
不幸的是,他们无法改变价值,但现在我有了问题的证据,所以我现在可以自由地改变架构。