2010-11-30 13 views
8

Yukarıdan aşağıya arama yaptım, ancak bu konuyla ilgili hemen hemen hiçbir bilgiyi bulamıyorum. Bir metin kutusunaC# 3.5'de eşzamansız temsilci nasıl iptal edebilirim?

  1. Kullanıcı tipleri tek bir arama-string:

    Ne yapmak istediğim budur.

  2. 0,5 saniye bekledikten sonra bir arama yöntemini işaret eden temsilcisimi BeginInvoke yapmaya başladım.
  3. Kullanıcı tekrar bir char yazarsa, Aramayı iptal etmek ve yazılan yeni dizeyle yeni bir aramaya başlamak istiyorum.
  4. UI-Thread engellenmemelidir!

Bunu C# 3.5 kullanarak nasıl yapabilirim?

GÜNCELLEME:

Görünüm:

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

nasıl arka plan arama yöntemi yumurtlama için İptali sinyal CancellationTokenSource kullanabilir? – Lazarus

+0

Bir kod örneğini güncelledim! yukarıyı görmek! – Pascal

+0

İşbirliği yapmayan bir işlevin yürütülmesini temiz bir şekilde durduramazsınız. Bu fonksiyonun düzenli olarak kontrol ettiği bir bayraka ihtiyacınız var. 'CancellationToken' bunu .net 4'te yapar, 3.5'de yerleşik bir sınıf varsa hiçbir fikri yoktur. – CodesInChaos

cevap

5

BackGroudWorker geçin, size gereken tüm destekler (Noui Engelleme, İptali vb, İlerleme Raporlaması ..)

+0

Ben de kullanacağımı düşünüyorum. Toplam yanlış yoldaydım ... – Pascal

+0

@Pascal - Kaynak kodunuzu eksiksiz bir çözüm için paylaşabilir misiniz? –

İlgili konular