如何在C#3.5中取消异步委托?

时间:2010-11-30 12:26:08

标签: c# asynchronous delegates

我上传和下搜谷歌,但我找不到关于该主题的任何适当信息。

我想做的是:

  1. 用户在文本框中键入单个搜索字符串。
  2. 我等了0.5秒然后开始BeginInvoke指向搜索方法的委托。
  3. 如果用户再次键入一个字符,我想取消搜索并开始新搜索,并输入新的字符串。
  4. 不得阻止UI-Thread!
  5. 如何使用C#3.5做到这一点?

    更新

    查看

    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;                
            }
        }
    

2 个答案:

答案 0 :(得分:5)

切换到BackGroudWorker,支持您所需的一切(NoUI阻止,取消等,进度报告......)

答案 1 :(得分:1)

查看CancellationTokenSourceCancellationToken,它是一种线程安全的信号取消方法。

您使用CancellationTokenSourceCancellationToken的所有所有者(在您的情况下为搜索主题)发出取消信号