Wcf中的线程
问题描述:
我有一些WCF服务服务的方法LongTimeMethod。为避免请求超时,我下一步做:Wcf中的线程
public void LongTimeMethod(...)
{
Thread t = new Thread(delegate() {
LocalLongTimeMethod(...);
});
t.IsBackground = true;
t.Start();
}
private void LocalLongTimeMethod(...)
{
SomeOperations();
}
之后,SomeOperations运行速度快了10倍(!?)。 SomeOperations的结果是正确的。那么原因是什么,这是否正常?
还有一个问题:服务实例活着,而我的线程还没有完成?
答
那么是什么原因,这是正常的?
该方法不太可能执行10倍。由于你的WCF操作是void
- 你没有返回任何东西。相反,引言是线程允许WCF操作完成,并且它将继续在不同的线程上处理您的工作。
所以你调用你的WCF操作,它触发一个线程,并完成。它不会等待线程完成。如果客户端同步地调用操作,即使后台线程仍在那里完成所有工作,它似乎已经完成到客户端。
这通常被称为“继续燃烧”。
WCF内置的一个更好的选项是创建一个One Way Contract。
服务实例活着,而我的线程还没有完成?
最有可能的是。
答
除了vcsjones说过的话,如果你打算忘了,在服务器端使用ThreadPool.QueueUserWorkitem。不要创建一个线程。像ASP.net和WCF这样的服务器进程有一个线程池,这使得它更有效率(创建一个线程分配1MB的线程存储等),但更重要的是,它确保了一大堆请求不会使你的服务器 - 而是阻止等待从池中获取线程。
+1着火而忘记。添加了有关不从服务器进程创建线程的其他信息。 – bryanmac
当我说方法执行速度快10倍时,我的意思是秒表的结果。我在SomeOperations()之前启动它并在其执行后停止。我试过单向合同,结果是(例如)下一个:正常执行 - 3分钟,使用单向合同 - 3分钟,使用线程 - 30秒。重要的是我在**线程内使用了Stopwatch **。 –