异步任务取消C#Xamarin

萨加尔·潘瓦拉(Sagar Panwala)

我具有搜索用户的功能。我提供了一个textview,在该textview更改的方法上,我激发了一种从Web服务器获取数据的方法。但是,当用户键入字母时,我会遇到问题,因为所有api命中都是在异步任务中完成的。服务应在等待100毫秒后才能命中,这意味着如果用户键入字母“ a”然后没有键入100毫秒,则我们必须命中该服务。但是,如果用户键入“ a”,然后键入“ b”,然后键入“ c”,则应为“ abc”而不是全部单击一个服务。

我遵循了官方链接,但对我没有帮助https://msdn.microsoft.com/zh-cn/library/jj155759.aspx

所以基本上这是我的代码

textview.TextChange+= (sender,e) =>{
  CancellationTokenSource cts = new CancellationTokenSource();
      await Task.Delay(500); 
      // here some where I have to pass cancel token
      var lst = await APIClient.Instance.GetUserSearch("/user/get?searchTerm=" + newText, "application/json",cts);
      if (lst != null && lst.Count > 0){ 
        lstSearch.AddRange(lst);
      }
  }

这是我的GetUser方法

 public async Task<JResponse> GetUserSearch<JResponse>(string uri, string contentType,CancellationToken cts)
    {
        try
        {
            Console.Error.WriteLine("{0}", RestServiceBaseAddress + uri);

            string url = string.Format("{0}{1}", RestServiceBaseAddress, uri); 

            var request = (HttpWebRequest)WebRequest.Create(url);
            request.ContentType = contentType;
            if (Utility.CurrentUser != null && !string.IsNullOrWhiteSpace(Utility.CurrentUser.AuthToken))
            {
                request.Headers.Add("api_key", Utility.CurrentUser.AuthToken);
            }
            request.Method = "POST";

            var payload = body.ToString();

            request.ContentLength = payload.Length;

            byte[] byteArray = Encoding.UTF8.GetBytes(body.ToString());
            request.ContentLength = byteArray.Length;

            using (var stream = await request.GetRequestStreamAsync())
            {
                stream.Write(byteArray, 0, byteArray.Length);
                stream.Close();
            }
            using (var webResponse = await request.GetResponseAsync())
            {
                var response = (HttpWebResponse)webResponse;
                using (var reader1 = new StreamReader(response.GetResponseStream()))
                {
                    Console.WriteLine("Finished : {0}", uri);
                    var responseStr = reader1.ReadToEnd();  
                    var responseObj = JsonConvert.DeserializeObject<JResponse>(
                        responseStr,
                        new JsonSerializerSettings()
                        {
                            MissingMemberHandling = MissingMemberHandling.Ignore,
                            NullValueHandling = NullValueHandling.Ignore
                        });
                    return responseObj;
                }
            }
        }
        catch (System.Exception ex)
        {
            Utility.ExceptionHandler("APIClient", "ProcessRequestAsync", ex);
        }

        return default(JResponse);
    }
马特·科尔

在您的示例中,您正在创建一个CancellationTokenSource-您需要保留对其的引用,以便下次调用该处理程序时,可以取消上一个搜索。是您应该能够运行的示例控制台应用程序,但重要的是在处理程序中。

private CancellationTokenSource _cts;

private async void TextChangedHandler(string text)   // async void only for event handlers
{
    try
    {
        _cts?.Cancel();     // cancel previous search
    }
    catch (ObjectDisposedException)     // in case previous search completed
    {
    }

    using (_cts = new CancellationTokenSource())
    {
        try
        {
            await Task.Delay(TimeSpan.FromSeconds(1), _cts.Token);  // buffer

            var users = await _userService.SearchUsersAsync(text, _cts.Token);
            Console.WriteLine($"Got users with IDs: {string.Join(", ", users)}");
        }
        catch (TaskCanceledException)       // if the operation is cancelled, do nothing
        {
        }
    }
}

一定要传递CancellationToken所有async方法,包括那些进行网络请求,这样,你的信号撤销权降到最低水平。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java线程与C#Xamarin中的异步任务

来自分类Dev

C#异步任务取消

来自分类Dev

春天取消@异步任务

来自分类Dev

异步取消任务

来自分类Dev

取消异步任务?

来自分类Dev

使用异步任务取消任务

来自分类Dev

C#Xamarin OnClick函数

来自分类Dev

C#Xamarin中的RegisterDataSetObserver

来自分类Dev

C#Xamarin中的RegisterDataSetObserver

来自分类Dev

通过按钮取消异步任务

来自分类Dev

在Android中取消异步任务

来自分类Dev

通过按钮取消异步任务

来自分类Dev

取消 WebClient 下载任务异步

来自分类Dev

C#xamarin循环进度栏-Android

来自分类Dev

C#Xamarin错误的If子句被使用?

来自分类Dev

C#Xamarin错误的If子句被使用?

来自分类Dev

以C#Xamarin形式获取JSON

来自分类Dev

在C#Xamarin中更改DateFomat

来自分类Dev

Android-Loopj异步任务取消

来自分类Dev

单击按钮后无法取消异步任务

来自分类Dev

在ReactiveUI ViewModel(ReactiveObject)中取消异步任务

来自分类Dev

取消所有异步任务

来自分类Dev

如何从客户端取消异步任务

来自分类Dev

如何使用标签主机取消异步任务

来自分类Dev

Android-Loopj异步任务取消

来自分类Dev

在ReactiveUI ViewModel(ReactiveObject)中取消异步任务

来自分类Dev

使用 CancellationTokenSource 取消之前的异步任务

来自分类Dev

C#5 .NET MVC长异步任务,进度报告和全局取消

来自分类Dev

取消的异步任务导致“任务已销毁,但未决”