2010-11-30 8 views
8

Ich habe google nach oben und unten gesucht, aber ich kann fast keine richtigen Informationen zu diesem Thema finden.Wie kann ich einen asynchronen Delegaten in C# 3.5 abbrechen?

Was ich tun möchte, ist dies:

  1. Benutzertypen eine einzige Such-Zeichenfolge in einem Textfeld.
  2. Ich warte 0,5 s dann beginne ich BeginInvoke meine Delegierten zeigen auf eine Suchmethode.
  3. Wenn der Benutzer erneut ein Zeichen eingibt, möchte ich die Suche abbrechen und eine neue Suche mit der neuen eingegebenen Zeichenfolge starten.
  4. Der UI-Thread darf nicht blockiert werden!

Wie kann ich das mit C# 3.5 tun?

UPDATE:

Ansicht:

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

Wie zu signalisieren laichen Sie die Methode Hintergrund suchen? – Lazarus

+0

Ich habe ein Codebeispiel aktualisiert! siehe oben! – Pascal

+0

Sie können die Ausführung einer nicht kooperierenden Funktion nicht sauber stoppen. Sie benötigen eine Flagge, die diese Funktion regelmäßig überprüft. 'CancellationToken' macht das in .net 4, keine Ahnung ob es eine eingebaute Klasse in 3.5 gibt. – CodesInChaos

Antwort

5

Switch to BackGroudWorker ist unterstützt alles, was Sie benötigen (noui Blocking, Stornierung ect, Fortschrittsbericht ..)

+0

Ich denke auch ich werde es benutzen. Ich war auf dem völlig falschen Weg ... – Pascal

+0

@Pascal - können Sie Ihren Quellcode für die komplette Lösung teilen? –

1

Werfen Sie einen Blick auf und CancellationToken, es ist eine Thread-sichere Methode, um die Aufhebung zu signalisieren.

Sie verwenden die CancellationTokenSource Annullierung für alle Besitzer von CancellationToken (Such Faden in Ihrem Fall)

+1

Ihre 2 Links beziehen sich auf .NET 4.0 oder? Ich benutze nur 3,5 hier! – Pascal

+0

ok, du hast Recht, sorry – thumbmunkeys

Verwandte Themen