Λοιπόν, συνάντησα το εξής κουφό. Προσπαθώ να εκτελέσω ασύγχρονα ένα πολύ βαρύ stored procedure (ώρες!) , καλώντας το με την BeginExecuteNonQuery(). Η βάση είναι SQL Server 2000, το ADO.NET 2.0 και ο provider ο SqlClient. Το stored procedure εκτελείται κανονικότατα και επιστρέφει τα αποτελέσματα που περιμένω. Θέλω όμως ο χρήστης να έχει και τη δυνατότητα να διακόπτει την εκτέλεση του.
Αμ δε! Δοκίμασα να καλέσω την Cancel του SqlCommand, η οποία όμως μπλοκάρει μέχρι να τελειώσει το stored procedure! Αν δεν καλέσω την Cancel αλλά τερματίσω την εφαρμογή, το SqlCommand εξακολουθεί να εκτελείται στο Thread Pool!
Δοκίμασα να φτιάξω ένα δικό μου thread και να εκτελέσω εκεί το SqlCommand. Όταν ο χρήστης ζητάει ακύρωση, καλώ την Thread.Abort και λογικά περιμένω να εμφανιστεί ένα ThreadAbortException. Πάλι τίποτα! Και αυτή τη φορά, το ThreadAbortException εμφανίζεται μόνο όταν τελειώσει το SqlCommand!
Τώρα κάτι άρχισα να ψυλιάζομαι. Απ' όσο ξέρω, το abort δεν είναι άμεσο όταν χρησιμοποιεί κανείς Interop, είτε COM είτε με P/Invoke. Εγώ όμως χρησιμοποιώ SqlClient!
Έχει κανείς καμμία ιδέα?
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos