我在WCF服务中遇到了一个非常奇怪的错误,当我使用NetTcpBinding时,它似乎以某种方式在套接字级别创建了死锁或线程饥饿.我有一个非常简单的自托管服务:
class Program { static void Main(string[] args) { using (ServiceHost serviceHost = new ServiceHost(typeof(TestService))) { serviceHost.Open(); Console.WriteLine("Pressto terminate service."); Console.ReadLine(); serviceHost.Close(); } Uri baseAddress = new Uri("net.tcp://localhost:8014/TestService.svc"); } } [ServiceContract] public interface ITestService { [OperationContract] string GetData(string data); } public class TestService: ITestService { public string GetData(string data) { Console.WriteLine(data); Thread.Sleep(5000); return "Ok"; } }
配置部分:
我有一个客户端在许多线程中使用这个服务,为每个线程创建新实例(这是一个要求):
static void Main(string[] args) { for (int i = 0; i < 1000; i++) { Thread tr = new Thread(() => { using (var service = new Test.TestServiceClient()) { var result = service.GetData(i.ToString()); Console.WriteLine(string.Format("{0}: {1} {2}", DateTime.Now, result, Thread.CurrentThread.ManagedThreadId)); } }); tr.Start(); } Console.ReadLine(); }
在这种情况下,在一些请求客户端引发EndpointNotFoundException,TCP错误代码10061之后,由于目标机器主动拒绝它,因此无法建立连接.请求的数量始终不同,并且它不是服务器部分,因为它仍然在正常状态下工作.而且我看到它不断收到请求,在这种情况下最奇怪的是什么.奇怪的是,它可以使你的客户端主机在异常后成为"不朽" - 所以除了系统的重启之外,你不能以任何方式杀死它.我很确定问题是在客户端的低套接字级别,并且它以某种方式与如此大量的线程连接,但我没有成功找到可以解释问题的东西.