我有一些方法LongTimeMethod的WCF服务。为了避免请求超时,我接下来做:
public void LongTimeMethod(...)
{
Thread t = new Thread(delegate() {
LocalLongTimeMethod(...);
});
t.IsBackground = true;
t.Start();
}
private void LocalLongTimeMethod(...)
{
SomeOperations();
}
之后,SomeOperations运行速度提高了10倍(!?)。 SomeOperations的结果是对的。那是什么原因,这是正常的吗?
还有一个问题:当我的线程没有完成时,服务实例是否处于活动状态?
答案 0 :(得分:4)
那是什么原因,这是正常的吗?
该方法不太可能执行快10倍。由于您的WCF操作是void
- 您没有返回任何内容。相反,介绍是线程允许WCF操作完成,它将继续在不同的线程上处理您的工作。
因此,您调用WCF操作,它会触发一个线程并完成。它不会等待线程完成。如果客户端同步调用操作,即使后台线程仍然在那里完成所有工作,它似乎已完成到客户端。
这通常被称为“永远不会忘记”。
WCF内置的更好的选择是创建One Way Contract。
服务实例是否处于活动状态,而我的线程尚未完成?
很可能是。
答案 1 :(得分:1)
除了vcsjones所说的,如果你要解雇并忘记,请在服务器端使用ThreadPool.QueueUserWorkitem。不要创建一个线程。服务器进程(如ASP.net和WCF)有一个线程池,使其更高效(创建一个线程分配1MB的线程存储等...)但更重要的是,它确保大量请求不会降低您的服务器 - 而是阻止等待从池中获取线程。