异步取消任务

用户名

嗨,我有一个列表框每当用户选择一个项目时,都会向Web发送请求。现在,我想在用户选择该项目时取消上一个操作,然后开始新操作。

我使用以下代码执行此操作,我想知道这些代码是否运行良好。还是我应该尝试另一种方式?

private CancellationTokenSource ts = new CancellationTokenSource();
private async void Subf2mCore(CancellationToken ct)
{
  HtmlDocument doc = await web.LoadFromWebAsync(url);
   ...
  foreach (var node in doc)
  {
    if (!ct.IsCancellationRequested)
    {
      ....
    }
  }
}

我以这种方式运行func

ts?.Cancel();
ts = new CancellationTokenSource();
Subf2mCore(ts.Token);
德米特里·拜琴科(Dmitry Bychenko)

从技术上讲,您可以这样说,但请注意:您开火并忘记了,让返回Task者知道是否Subf2mCore完成失败取消

private async Task Subf2mCore(CancellationToken ct)
{
  HtmlDocument doc = await web.LoadFromWebAsync(url);
   ...
  foreach (var node in doc)
  {
    // Often we cancel by throwing exception: 
    // it's easy to detect that the task is cancelled by catching this exception
    // ct.ThrowIfCancellationRequested();

    // You prefer to cancel manually: 
    // your cancellation can be silent (no exceptions) but it'll be 
    // difficult for caller to detect if task completed or not 
    // (partially completed and cancelled)
    if (!ct.IsCancellationRequested)
    {
      ....
    }
  }
}

// If we don't want to cancel 
private async Task Subf2mCore() => Subf2mCore(CancellationToken.None);

用法:不要忘记Dispose CancellationTokenSource实例:

using (CancellationTokenSource ts = new CancellationTokenSource()) {
  ...
  await Subf2mCore(ts.Token);
  ...
}

编辑:如果您想从外面取消

private CancellationTokenSource ts = null;

...

using (CancellationTokenSource _ts = new CancellationTokenSource()) {
  // previous task (if any) cancellation
  if (null != ts)
    ts.Cancel();

  // let cancel from outside
  ts = _ts;

  try {
    ...
    await Subf2mCore(_ts.Token);
    ...
  }
  finally {
    // task completed, we can't cancel it any more
    ts = null;
  }
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

春天取消@异步任务

来自分类Dev

取消异步任务?

来自分类Dev

使用异步任务取消任务

来自分类Dev

通过按钮取消异步任务

来自分类Dev

在Android中取消异步任务

来自分类Dev

通过按钮取消异步任务

来自分类Dev

C#异步任务取消

来自分类Dev

取消 WebClient 下载任务异步

来自分类Dev

Android-Loopj异步任务取消

来自分类Dev

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

来自分类Dev

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

来自分类Dev

异步任务取消C#Xamarin

来自分类Dev

取消所有异步任务

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Android-Loopj异步任务取消

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在Swift中触摸屏幕时取消的异步任务

来自分类Dev

如果正在运行,则取消异步任务

来自分类Dev

如何-具有超时和取消功能的多个异步任务

来自分类Dev

如何取消活动中按回的异步任务

来自分类Dev

不确定如何取消长时间运行的异步任务

来自分类Dev

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

来自分类Dev

显示IProgress并支持取消WinForms异步任务的模式进度表单

来自分类Dev

Windows Phone 8,需要在返回键上取消异步任务

来自分类Dev

如何在超时的情况下取消龙卷风中悬挂的异步任务?

来自分类Dev

如何在useEffect清理功能中取消所有订阅和异步任务?