子级任务已取消,父级已完成?

不同的

当附加孩子时,我试图了解.net任务的行为。

我有以下测试代码:

void Test()
{
    var tokenSource = new CancellationTokenSource();
    var token = tokenSource.Token;

    Task child = null;
    var parent = Task.Factory.StartNew(() =>
    {
        child = Task.Factory.StartNew(() =>
        {
            while (!token.IsCancellationRequested)
                Thread.Sleep(100);
            token.ThrowIfCancellationRequested();
        }, token, TaskCreationOptions.AttachedToParent, TaskScheduler.Default);
    }, token);

    Thread.Sleep(500);

    Debug.WriteLine("State of parent before cancel is {0}", parent.Status);
    Debug.WriteLine("State of child before cancel is {0}", child.Status);

    tokenSource.Cancel();
    Thread.Sleep(500);

    Debug.WriteLine("State of parent is {0}", parent.Status);
    Debug.WriteLine("State of child is {0}", child.Status);
}

结果是:

State of parent before cancel is WaitingForChildrenToComplete
State of child before cancel is Running
A first chance exception of type 'System.OperationCanceledException' occurred in mscorlib.dll
State of parent is RanToCompletion
State of child is Canceled

显然,父任务状态不是Canceled,即使两个任务共享令牌并且已附加子任务。

Canceled取消发生后如何使父任务返回状态

注意如果我抛出异常,则两个任务都将返回Faulted

克鲁梅鲁尔

如MSDN上所述,这是预期的行为。父任务必须等待(向下滚动到取消部分)子任务。父任务必须处理所有良性故障(例如取消)。

要使您的父任务失败,只需等待并传递令牌:

Task child = null;
var parent = Task.Factory.StartNew(() =>
{
  child = Task.Factory.StartNew(() =>
  {
    while (!token.IsCancellationRequested) Thread.Sleep(100);
    token.ThrowIfCancellationRequested();
  }, token, TaskCreationOptions.AttachedToParent, TaskScheduler.Default);

  // This is the magic line.
  child.Wait(token);
}, token);

如果您要使用此代码来做一些富有成效的工作,而不仅仅是为了进行测试,则还应该考虑使用简化的Task.Run()支持async委托,而不是Task.Factory.StartNew()这篇文章非常有趣。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

已取消的任务也显示为已完成

来自分类Dev

尽管已取消,但UIView animateWithDuration完成已完成= YES?

来自分类Dev

父任务不等待子任务完成

来自分类Dev

查看已完成的 Elasticsearch 任务

来自分类Dev

Task.ContinueWith()父任务不等待子任务完成

来自分类Dev

等待已取消的任务完成,然后再继续执行

来自分类Dev

从列表<任务>中删除已完成的任务

来自分类Dev

清除已完成的任务按钮任务列表

来自分类Dev

仅在父级上捕获或取消JS滚轮事件-子级不捕获或取消

来自分类Dev

父线程join():在子级完成之前阻止?

来自分类Dev

父线程join():在子级完成之前阻止?

来自分类Dev

将任务标记为已完成

来自分类Dev

重新启动已完成的任务

来自分类Dev

等待异步方法中已完成的任务

来自分类Dev

在 rails 中找出已完成的任务

来自分类Dev

如何找出哪个任务已完成

来自分类Dev

取消父级监听器的链接是否将其应用于Firebase中的子级

来自分类Dev

反应在父级减速器与子级减速器中完成的Redux逻辑

来自分类Dev

父级点击不适用于子级链接,但链接已禁用

来自分类Dev

任务已取消异常(ThrowForNonSuccess)

来自分类Dev

如何创建已取消的任务

来自分类Dev

如何还原已取消的任务

来自分类Dev

在用户取消任务之前让任务完成

来自分类Dev

如何检测多个pdf.js渲染任务已完成

来自分类常见问题

等待与task.Result相同的已完成任务?

来自分类Dev

如何检查线程是否已完成其任务?

来自分类Dev

同步对象,以确保所有任务均已完成

来自分类Dev

在关闭程序之前,确认所有任务已完成

来自分类Dev

如果Volley RequestQueue已完成所有任务,则回调?

Related 相关文章

热门标签

归档