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

服务实例活着,而我的线程还没有完成?

最有可能的是。

+0

+1着火而忘记。添加了有关不从服务器进程创建线程的其他信息。 – bryanmac

+0

当我说方法执行速度快10倍时,我的意思是秒表的结果。我在SomeOperations()之前启动它并在其执行后停止。我试过单向合同,结果是(例如)下一个:正常执行 - 3分钟,使用单向合同 - 3分钟,使用线程 - 30秒。重要的是我在**线程内使用了Stopwatch **。 –

除了vcsjones说过的话,如果你打算忘了,在服务器端使用ThreadPool.QueueUserWorkitem。不要创建一个线程。像ASP.net和WCF这样的服务器进程有一个线程池,这使得它更有效率(创建一个线程分配1MB的线程存储等),但更重要的是,它确保了一大堆请求不会使你的服务器 - 而是阻止等待从池中获取线程。