Wcf中的线程

时间:2011-10-04 14:00:57

标签: .net multithreading wcf

我有一些方法LongTimeMethod的WCF服务。为了避免请求超时,我接下来做:

    public void LongTimeMethod(...)
    {
        Thread t = new Thread(delegate() {
            LocalLongTimeMethod(...);
        });
        t.IsBackground = true;
        t.Start();
    }

    private void LocalLongTimeMethod(...)
    {
      SomeOperations();
    }

之后,SomeOperations运行速度提高了10倍(!?)。 SomeOperations的结果是对的。那是什么原因,这是正常的吗?

还有一个问题:当我的线程没有完成时,服务实例是否处于活动状态?

2 个答案:

答案 0 :(得分:4)

  

那是什么原因,这是正常的吗?

该方法不太可能执行快10倍。由于您的WCF操作是void - 您没有返回任何内容。相反,介绍是线程允许WCF操作完成,它将继续在不同的线程上处理您的工作。

因此,您调用WCF操作,它会触发一个线程并完成。它不会等待线程完成。如果客户端同步调用操作,即使后台线程仍然在那里完成所有工作,它似乎已完成到客户端。

这通常被称为“永远不会忘记”。

WCF内置的更好的选择是创建One Way Contract

  

服务实例是否处于活动状态,而我的线程尚未完成?

很可能是。

答案 1 :(得分:1)

除了v​​csjones所说的,如果你要解雇并忘记,请在服务器端使用ThreadPool.QueueUserWorkitem。不要创建一个线程。服务器进程(如ASP.net和WCF)有一个线程池,使其更高效(创建一个线程分配1MB的线程存储等...)但更重要的是,它确保大量请求不会降低您的服务器 - 而是阻止等待从池中获取线程。