WCF :: ServiceHost: Oddity ... Ainda vivo mesmo segmento está morto?
-
06-09-2019 - |
Pergunta
um novo membro aqui. Bom ver uma comunidade tão puro.
Depois de um pouco de pesquisa, eu decidi usar WCF no meu aplicativo para fazer a comunicação entre processos, por isso estou usando o NetNamedPipeBinding vinculativo.
A aplicação de hospedagem ServiceHost não é um servidor dedicado, por isso tem que gerar o ServiceHost via um fio. Até aqui tudo bem.
Então, eu tenho algo como o seguinte:
Foo()
{
Thread serverThread = new Thread(new ThreadStart(ServerThread));
serverThread.Start();
Console.WriteLine("Foo Exited");
}
ServerThread()
{
Uri baseAddress = new Uri("net.pipe://localhost/service");
ServiceHost serviceHost = new ServiceHost(typeof(MyService), baseAddress);
...
serviceHost.Open();
Console.WriteLine("Server Thread Exited");
}
Assim como esperado, eu vejo:
-> Server Thread Exited
-> Foo Exited
Mas para minha surpresa, apesar do segmento do servidor está sendo executado em excitou, o cliente pode ainda se conectar à ServiceHost e o host de serviço processa a solicitação corretamente!
Então, como é que o ServiceHost ainda está a processar e tratar solicitações mesmo que seja thread principal (aquele em que foi criado) está morto?
Além disso, há uma maneira melhor para manter o ServerThread vivo depois de um tempo (true) {Thread. Sleep (100);}
Graças.
Solução
Quando você chama Abrir no ServiceHost, um segmento adicional será criado para escutar as solicitações de serviços recebidas. Desta forma, a sua discussão pode ter em execução acabado, mas outro segmento foi criado, e continuará a funcionar até que você chama de "Close" na ServiceHost.
Pode não ser necessário no seu caso para a desova fora de um fio de si mesmo. Basta abrir o seu ServiceHost no segmento principal do aplicativo. Você pode então fazer outras coisas em seu segmento principal, e quando você está pronto para matar o hospedeiro, basta ligar serviceHost.Close ().
Aqui está uma descrição muito bom que eu encontrei:
http://www.code-magazine.com/article. aspx? quickid = 0701041 & page = 1