2010-11-30 4 views
8

私はgoogleを検索しましたが、そのトピックに関するほぼすべての適切な情報を見つけることができません。テキストボックスにC#3.5で非同期デリゲートをキャンセルするにはどうすればよいですか?

  1. ユーザータイプ単一の検索文字列:

    は、私は何をしたいことはこれです。

  2. 私は0.5秒待ってから、BeginInvokeを呼び出して、代理人が検索方法を指し示すようにします。
  3. ユーザーがもう一度char型を入力した場合、検索をキャンセルして、入力した新しい文字列で新しい検索を開始します。
  4. UIスレッドをブロックしてはいけません!

C#3.5を使用してどうすればいいですか?

UPDATE

ビュー

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

どのようにして、バックグラウンド検索方法を生み出していますか? – Lazarus

+0

コードサンプルを更新しました!上記を参照! – Pascal

+0

協力していない関数の実行をクリーンな方法で停止することはできません。この機能が定期的にチェックするフラグが必要です。 'CancellationToken'は.net 4でこれを行いますが、3.5に組み込みクラスがあるかどうかは分かりません。 – CodesInChaos

答えて

5

BackGroudWorkerに切り替え、ですが、あなたが必要なすべてのサポート(NOUIブロッキング、キャンセル電気ショック療法、進捗報告..)

+0

あまりにも私はそれを使用すると思います。私は完全な間違ったトラックにいた... – Pascal

+0

@Pascal - あなたは完全なソリューションのソースコードを共有できますか? –

1

CancellationTokenSourceCancellationTokenを見てください。これは、キャンセルを通知するスレッドセーフな方法です。

あなたは CancellationToken(あなたの場合の検索スレッド)のすべての所有者にキャンセルを通知するため CancellationTokenSourceを使用

+1

あなたの2つのリンクは.NET 4.0の権利を参照していますか?私はここで3.5を使用します! – Pascal

+0

ok、youre right、申し訳ありません – thumbmunkeys

関連する問題