2008-11-12 8 views
2

J'ai une architecture client-serveur où le client communique avec le serveur à l'aide de .NET Remoting. Le serveur gère toute la logique métier et l'interaction avec la base de données. Je dois ajouter une opération qui peut prendre du temps à s'exécuter et l'ensemble de données qu'elle renvoie peut être assez volumineux. Je pense employer l'appel asynchrone pour cela. Maintenant, le problème se pose: supposons, le client a fait cet appel asynchrone, l'opération a démarré une requête SQL, et l'utilisateur ferme le client ou clique sur Annuler - qu'adviendra-t-il de l'opération? Est-il possible d'annuler l'appel asynchrone en attente, qui est occupé à parler au serveur SQL?Annulation de l'appel asynchrone à distance

Merci.

Répondre

1

Vous pouvez concevoir votre interaction client/serveur de sorte que le serveur laisse un thread de travail effectuer les tâches SQL afin qu'il soit prêt à recevoir un autre appel du client. Ainsi, le client fait l'appel 1 et dit faire le travail de SQL. Le serveur donne ce travail au thread de travail et est prêt pour de nouvelles entrées. Ensuite, le client fait l'appel 2 et dit, "ne t'inquiète pas". Le serveur effectue une certaine comptabilité pour s'assurer qu'il ne rappelle pas le client lorsque le thread de travail est terminé.

Le serveur peut-il interrompre le thread de travail en toute sécurité. Je ne suis pas sûr. Cela aurait-il un effet sur ce que fait SQL Server? Pas certain.

0

Que faites-vous maintenant avec l'appel en cours lorsque le client ferme l'application? Vous pouvez faire la même chose avec un appel asynchrone.

Oui, async est la solution idéale pour les demandes de longue durée. Si le jeu de résultats est assez grand, vous pouvez même penser à envoyer des morceaux avec plusieurs réponses du serveur. Lorsque l'utilisateur clique sur Annuler, vous envoyez un nouveau message au serveur indiquant que vous n'êtes plus intéressé par les résultats. Si la requête SQL est en cours d'exécution sur le pool de threads, vous ne pouvez pas vraiment l'annuler.