wcf - 如何强制WCF服务只使用一个线程?

标签 wcf

由于内部操作依赖于不支持多线程调用的旧版 COM 对象,因此我需要强制 WCF 服务在单线程中运行。

然后我编写了以下示例代码,但它没有按我的预期工作:(

[ServiceContract]
public interface ITestService
{
    [OperationContract]
    void TestAction();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode =     ConcurrencyMode.Single)]
public class TestServiceImp : ITestService
{
    void TestAction()
    {
        Trace.WriteLine("Entering method TestAction, Thread={0}" + Thread.CurrentThread.ManagedThreadId);
        //...
        Trace.WriteLine("Leaving method TestAction, Thread={0}" + Thread.CurrentThread.ManagedThreadId);
    }
}

实际结果如下所示,

输入方法 TestAction,Thread=4

离开方法 TestAction,Thread=4

输入方法 TestAction,Thread=5

离开方法 TestAction,Thread=5

输入方法 TestAction,Thread=8

离开方法 TestAction,Thread=8

虽然我的期望是,

输入方法 TestAction,Thread=4

离开方法 TestAction,Thread=4

输入方法 TestAction,Thread=4

离开方法 TestAction,Thread=4

输入方法 TestAction,Thread=4

离开方法 TestAction,Thread=4

我怎样才能得到我想要的东西?谢谢。

最佳答案

将 InstanceContextMode 声明为“Single”仅意味着来自不同客户端的每个调用都将在同一个实例上执行,但负责执行的线程由线程池管理。

基本上,如果您为每个调用使用并发模式“单一”(默认配置),则会从线程池中获取线程,使用然后返回给它,因此线程可能是相同的但不能保证

如果您想管理对非线程安全资源的访问,您应该手动执行此操作,以定义哪个线程将执行您的服务实例,您必须使用 同步上下文

http://nevmehta.blogspot.ch/2006/12/what-is-usesynchronizationcontext.html

http://msdn.microsoft.com/en-us/magazine/gg598924.aspx

希望这有帮助 马可

关于wcf - 如何强制WCF服务只使用一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11894809/

相关文章:

wcf - 从自定义源(非标准XML)加载WCF配置(用于服务器+客户端)

c# - 使用 WCF 服务的互操作服务创建 Excel 文件流

c# - 如何在 WCF 服务中将接口(interface)作为参数传递?

java - 具有客户端证书身份验证的 WCF 服务的 Tomcat 应用程序

c# - 使用 IIS 与第三方 dll 的 WCF 服务连接

c# - WCF 中 MustUnderstand 属性的用途是什么?

wcf - 无法识别VS2010 SvcUtil.exe命令

c# - WCF 无法通过 HTTPS 工作

wcf - Apache.NMS.WCF

c# - WCF ObjectDisposedException 安全句柄已发布/ASP.NET MVC3 客户端/线程