由于内部操作依赖于不支持多线程调用的旧版 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/