2017-05-02 2 views
1

Nous utilisons un service WCF et l'hébergeons dans notre service Windows. Ce concept est expliqué here.Problèmes liés au thread long-coureur dans le service Windows WCF

Nous avons un appel de service WCF qui ressemble à ceci:

[System.ServiceModel.OperationContractAttribute(...)] 
    [System.ServiceModel.FaultContractAttribute(...)] 
    void TriggerLongRunningOperation(int id); 

Dans cet appel WCF, nous essaimer un peu et oublier le feu de nouvelles discussions pour accomplir des tâches de fond. Pour la plupart, il n'y en aura qu'un, mais il pourrait y en avoir plusieurs. La requête WCF se termine essentiellement immédiatement et le thread fire-and-forget effectue son travail. Les opérations qui sont séparées peuvent durer de 2 minutes à 1 heure.

Je suis préoccupé par l'existence d'un thread à exécution longue dans le processus WCF. Cependant, comme il n'est pas hébergé via IIS, nous n'avons pas à nous inquiéter du recyclage du pool d'applications. Quelles sont les préoccupations dont je dois tenir compte lors de l'exécution de nouveaux threads dans un service WCF hébergé dans un service Windows? Dans quels cas le thread serait-il abandonné?

.NET 4.5.2

+0

Vous pouvez consulter un document d'information comme http://hangfire.io. Cela peut s'exécuter dans le service Windows et fournir une exécution de tâche d'arrière-plan durable. –

Répondre

2

Je serais préoccupé par la fiabilité. Ces threads peuvent être interrompus en raison d'une exception ou d'un redémarrage du système, ou de nombreuses autres situations sur lesquelles les threads pourraient être perdus.

En outre, je dirais que feu et oublier approche n'a rien à voir avec la fiabilité: cela signifie simplement que l'appelant ne se soucie pas du résultat de l'ensemble de l'opération.

Ainsi, je rechercherais une file d'attente de messages fiable comme RabbitMQ. Autrement dit, vous allez traiter ces opérations et oublier les opérations de manière asynchrone dans un autre thread de celui qui déclenche ces opérations, et vous pourrez les réessayer si quelque chose ne va pas bien avant qu'elles se terminent correctement.