Est-il possible d'annuler une requête linq2sql? Comme si j'avais construit une requête qui prend un certain temps, je voudrais que l'utilisateur puisse l'annuler. Est-ce que quelqu'un a de bonnes idées à ce sujet?C#: Est-il possible d'annuler une requête linq2sql?
Répondre
Ainsi, selon le commentaire de Richard Szalay:
Votre meilleur pari est d'exécuter la requête dans un thread d'arrière-plan et simplement résilier votre abonnement de les événements de l'objet conteneur lorsque l'utilisateur clique sur Annuler.
Et je pense que je suis d'accord pour dire que c'est un bon travail pour le moment. Ce que j'aimerais voir, c'est une fonctionnalité de requête Async déjà dans le framework, mais jusqu'à ce que cela se produise, cela devra être fait.
ont pas commencé à mettre en œuvre ce encore (doivent terminer d'autres choses d'abord), mais d'une façon il pourrait fonctionner:
- Dans le fil de travail, faire les requêtes dans un thread de requête séparée puis Joignez ce fil jusqu'à ce qu'il soit terminé.
- Lorsque l'utilisateur clique sur annuler, appelez la méthode
Interrupt
du thread de travail, qui obtiendrait alors un et cesserait d'attendre la fin du thread de requête.
pouvez ajouter un code plus tard, quand je le fais. Mais nous verrons comment il se trouve à peu: p
Je dirais que vous auriez probablement besoin de l'exécuter sur un thread distinct et l'annuler à la place.
comment pouvez-vous annuler un fil? – Svish
Je ne recommande pas de descendre ce chemin. L'utilisation de Thread.Abort est une mauvaise pratique et ne garantit même pas l'abandon du thread. Voir http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx –
ouais, je voulais lire quelque chose comme ça aussi. – Svish
Si vous définissez la propriété CommandTimeout (secondes) de DataContext, une exception est automatiquement levée une fois le délai écoulé.
Je sais que cette réponse est un peu en retard, mais voici comment je le fais:
class Program
{
public class Person
{
public string Name;
public int Age;
}
public static void ExecuteQueryAsync (IEnumerable<Person> collectionToQuery , Action<List<Person>> onQueryTerminated , out Action stopExecutionOfQuery)
{
var abort = false;
stopExecutionOfQuery =() =>
{
abort = true;
};
Task.Factory.StartNew(() =>
{
try
{
var query = collectionToQuery.Where(x =>
{
if (abort)
throw new NotImplementedException("Query aborted");
// query logic:
if (x.Age < 25)
return true;
return
false;
});
onQueryTerminated(query.ToList());
}
catch
{
onQueryTerminated(null);
}
});
}
static void Main (string[] args)
{
Random random = new Random();
Person[] people = new Person[ 1000000 ];
// populate array
for (var i = 0 ; i < people.Length ; i++)
people[ i ] = new Person() { Age = random.Next(0 , 100) };
Action abortQuery;
ExecuteQueryAsync(people , OnQueryDone , out abortQuery);
// if after some time user wants to stop query:
abortQuery();
Console.Read();
}
static void OnQueryDone (List<Person> results)
{
if (results == null)
Console.WriteLine("Query was canceled by the user");
else
Console.WriteLine("Query yield " + results.Count + " results");
}
}
- 1. Comment faire une requête Linq2SQL dynamique?
- 2. Problème avec la requête linq2sql
- 3. Types hérités Linq2SQL et requête OfType
- 4. une sous-requête dans une sous-requête - est-ce possible?
- 5. C#, Linq2SQL: Créer des expressions
- 6. Question sur les performances LINQ2Sql en C#
- 7. Sélection d'un seul élément avec la requête linq2sql
- 8. linqpad + linq2sql custom model
- 9. Linq2Sql - Stocking Complex Linq Requêtes pour l'exécution dynamique future - texte brut - possible?
- 10. possible JOIN pour cette requête
- 11. linq2sql désavantages
- 12. Linq2SQL: SubmitChanges couverts par une transaction?
- 13. Pouvez-vous implémenter une interface sur une classe Linq2Sql?
- 14. Performances LINQ2SQL avec transactions
- 15. Est-il possible de faire une requête SQL récursive?
- 16. Sélection des enregistrements en utilisant Linq2sql dans les classes linq2sql?
- 17. Types de référence Linq2SQL
- 18. C#, Linq2SQL: Obtenir le plus élevé de chaque groupe
- 19. Services RIA et Linq2Sql
- 20. créer une requête sql en C++/java?
- 21. Valider Linq2Sql avant SubmitChanges()
- 22. Question de requête SQL (jointure possible/Sous-requête?)
- 23. Convention de dénomination Linq2sql
- 24. Est-il possible? (C++)
- 25. C#: Comment voir si une entité Linq2SQL est dans la base de données
- 26. Comment écrire des requêtes compilées Linq2Sql dynamiques?
- 27. résultat possible en C#
- 28. Est-il possible de générer automatiquement mon Linq2Sql DBML via un script?
- 29. somme linq2sql + - Résumant en résultats
- 30. Création d'objets proxy Linq2Sql légers
Je recommande contre cette solution. L'utilisation de ThreadInterruptedException est tout aussi mauvaise que l'utilisation de Thread.Abort. Je recommande de lire l'article que j'ai posté dans mon commentaire à la réponse de Kieron. –
Peut-être aller dans une boucle et vérifier un drapeau ou quelque chose alors? Et puis juste revenir et ne pas attendre le résultat si l'utilisateur veut annuler? – Svish