2010-11-30 7 views
8

J'ai cherché google de haut en bas mais je ne trouve presque aucune information appropriée sur ce sujet.Comment puis-je annuler un délégué asynchrone dans C# 3.5?

Ce que je veux faire est la suivante:

  1. types d'utilisateurs une seule recherche-chaîne dans une zone de texte.
  2. J'attends 0,5 s puis je commence à BeginInvoke mon délégué pointant vers une méthode de recherche.
  3. Si l'utilisateur tape à nouveau un caractère, je souhaite annuler la recherche et commencer une nouvelle recherche avec la nouvelle chaîne tapée.
  4. L'UI-Thread ne doit pas être bloqué!

Comment puis-je faire cela en utilisant C# 3.5?

MISE À JOUR:

Voir:

private void OnTextChanged(...) 
{ 
    if (SearchFormatEvent != null) 
    { 
     ICollection<object> collection = SearchFormatEvent("MySearchString"); 
     // Do stuff on the returned collection        
    } 
} 

SearchProvider:

// This is the delegate invoked for the async search taking the searchstring typed by the user 
    public delegate ICollection<object> SearchInputTextStrategy<T>(string param); 

    public class SearchProvider : ISearchProvider 
    { 
     private ITextView _view; 
     private SearchInputTextStrategy<object> searchInputDelegate; 

     public SearchProvider(ITextView view) 
     { 
      _view = view; 
      _view.SearchFormatEvent += new ConstructSearchFormatDelegate(CostructSearchFormat); 
     } 

     private string SearchFormat(string param) 
     { 
      // compute string 

      return string.Empty; //... 
     } 

     public ICollection<object> CostructSearchFormat(string param) 
     { 
      var searchfilter = SearchFormat(param); 

      IAsyncResult pendingOperation = searchInputDelegate.BeginInvoke("searchfilter",null,null); 

      // How can I cancel the Async delegate ? 

      ICollection<object> result = searchInputDelegate.EndInvoke(pendingOperation); 

      return result;     
     } 
    } 
+1

Comment êtes-vous fraie la méthode de recherche de fond? – Lazarus

+0

J'ai mis à jour un échantillon de code! voir au dessus! – Pascal

+0

Vous ne pouvez pas arrêter l'exécution d'une fonction qui ne coopère pas de manière propre. Vous avez besoin d'un drapeau que cette fonction vérifie régulièrement. 'CancellationToken' le fait dans .net 4, aucune idée s'il y a une classe intégrée dans 3.5. – CodesInChaos

Répondre

5

Passer au BackGroudWorker, est prend en charge tout ce que vous avez besoin (noui Blocking, ect annulation, Rapport d'avancement ..)

+0

Je pense aussi que je vais l'utiliser. J'étais sur le mauvais chemin total ... – Pascal

+0

@Pascal - pouvez-vous partager votre code source pour la solution complète? –

1

Jetez un oeil à CancellationTokenSource et CancellationToken, c'est une méthode sûre de thread pour signaler l'annulation.

Vous utilisez le CancellationTokenSource pour signaler à tous les propriétaires d'annulation de CancellationToken (le fil de recherche dans votre cas)

+1

Vos 2 liens font référence à .NET 4.0 à droite? J'utilise 3.5 ici seulement! – Pascal

+0

ok, vous avez raison, désolé – thumbmunkeys

Questions connexes