当调用的方法未返回时取消整个任务

本文关键字:取消 任务 返回 调用 方法 | 更新日期: 2023-09-27 17:55:39

我有一个注册后台任务的方法,如下所示:

//snippet from task builder method
        try
        {
            cancellationTokenSource.CancelAfter(10000);
            btr = Task.Run(() => registerTask(builder, btr,cancellationTokenSource.Token), cancellationTokenSource.Token).Result;
        }
        catch (OperationCanceledException) // something went wrong
        {
            return null;
        }

private BackgroundTaskRegistration registerTask(BackgroundTaskBuilder builder, BackgroundTaskRegistration btr, CancellationToken token)
{
    CancellationTokenSource newToken = new CancellationTokenSource();
    Task cancelledCheck = Task.Run(() =>
    {
        while (true)
        {
            if (token.IsCancellationRequested)
            {
                newToken.Cancel();
                token.ThrowIfCancellationRequested();
            }
        }
    }, newToken.Token);
    btr = Task.Run(()=> builder.Register(),token).Result;
    return btr;
}

我的问题是有时是建筑商。Register() 方法不返回任何内容。这可能是某种Windows错误;Register() 方法永远不会在内部完成。事实上,10秒后,令牌。调用了 ThrowIfCancelRequest() 方法,但它不会抛出到调用它的 try-catch 语句。最初我打电话给建筑商。Register() 直接没有 Task.Run() 但它不起作用,这也没有。

但是,如果我用Task.Delay(ms)代替btr = Task.Run(() =>...ms > 10000,我的预期效果就会发生。

我做错了什么吗?或者有更好的方法可以做到这一点吗?基本上,我只需要使 registerTask() 方法在构建器时返回 null 的代码。Register() 在几秒钟后没有完成。

当调用的方法未返回时取消整个任务

用这样的东西替换代码对我有用:

    btr = null;
    cancellationTokenSource.CancelAfter(10000);
    Task registerTask = Task.Factory.StartNew(() =>
    {
      btr = builder.Register();
    });
   Task cancellationTask = Task.Factory.StartNew(() =>
   {
     while (true)
     {
       if (cancellationTokenSource.Token.IsCancellationRequested) break;
     }
     }, cancellationTokenSource.Token);
   Task[] tasks = new Task[2] { cancellationTask, registerTask };
   Task.WaitAny(tasks);

获取取消请求将触发其中一个任务结束,而不是处理错误,当它结束时,无论它是否为 null,我都会返回任务注册变量。