【问题标题】:How to handle cancellationToken.cancel for Task.delay in c#?如何在 C# 中处理 Task.delay 的 cancelToken.cancel?
【发布时间】:2019-05-08 10:31:20
【问题描述】:

我有一个使用 Task.Delay 1 分钟的方法。因此,当我想尝试取消该任务时,它会给我system.threading.tasks.taskcanceledexception a task was canceled 之类的错误,而不是取消该任务。

那么我怎样才能取消那个任务来处理这个错误呢。

public static System.Threading.CancellationTokenSource tokenSource = new System.Threading.CancellationTokenSource();

tokenSource.cancel();
public static async void waitForSignal(System.Threading.CancellationToken token)
{
       await Task.Delay(60000, token);  //here I am getting error while I am defining tokenSource cancel.
}

【问题讨论】:

  • 是的,when you cancel a task 就是这样。使用try catch 处理异常。
  • 您到底希望这做什么?您创建一个令牌然后取消它,然后想知道为什么不能延迟它?这段代码没有多大意义
  • 也许WaitOne method of the WaitHandle 是你真正追求的?
  • @Liam,实际上管理员正在从 wcf 服务获取信号,如果管理员不会从 wcf 获得预期的信号,那么它将等待 60 秒,如果管理员将在前 10 秒内获得预期的信号数量则不需要等待接下来的 50 秒。所以我需要使用cancellationtoken来取消任务。
  • WaitOne 会做什么

标签: c# async-await task


【解决方案1】:

那么我怎样才能取消那个任务来处理这个错误呢。

你已经取消了任务;你只需要处理错误:

try
{
  await Task.Delay(60000, token);
}
catch (OperationCanceledException)
{
}
...

实际上 admin 正在从 wcf 服务获取信号,如果 admin 无法从 wcf 获得预期信号,则它将等待 60 秒,如果 admin 将在前 10 秒内获得预期数量的信号,则无需等待接下来 50 秒。

听起来你想要的是信号,而不是取消。您想(异步地)等待一个信号或一个时间段(延迟),然后您想采取一些行动。你真的不想在这里取消。

一种异步信号是TaskCompletionSource<T>。你的动作代码可以await那个TCS的Task,信令代码可以调用SetResult发送信号。像这样的:

public static TaskCompletionSource<object> signal = new TaskCompletionSource<object>();

...

signal.SetResult(null);

...

public static async Task waitForSignal(Task signalTask)
{
  await Task.WhenAny(Task.Delay(60000), signalTask);
}

【讨论】:

  • 感谢您的宝贵回复。一旦我们使用 tokenSource.cancel() 方法取消任务,那么是否可以再次运行它?
  • 在我的场景中,我正在使用 CancellationTokenSource 取消任务,所以下次我想调用该方法时,它会给我类似 Token.IsCancellationRequested = true 的结果,但实际上我需要将其设为 false。我尝试更改它,但它显示只读属性。那么您能指导我如何使 CancellationRequester 为 false 吗?
  • 一个取消令牌只能取消一次。如果您需要另一个取消令牌,您应该创建另一个 CancellationTokenSource
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2011-06-05
  • 2010-09-18
  • 2020-08-23
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多