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:
- types d'utilisateurs une seule recherche-chaîne dans une zone de texte.
- J'attends 0,5 s puis je commence à BeginInvoke mon délégué pointant vers une méthode de recherche.
- 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.
- 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;
}
}
Comment êtes-vous fraie la méthode de recherche de fond? – Lazarus
J'ai mis à jour un échantillon de code! voir au dessus! – Pascal
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