c# – TPL继续任务:不确定谁是父任务
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – TPL继续任务:不确定谁是父任务,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1564字,纯文字阅读大概需要3分钟。
内容图文
![c# – TPL继续任务:不确定谁是父任务](/upload/InfoBanner/zyjiaocheng/771/d44832a1ef544455a4446cd95b8d8fc1.jpg)
我有ContinuationOption.AttachedToParent标志的麻烦.
这是我的伪代码:
Task parentTask = Task.Start(() =>
{
Task childTask = Task.Start(() => doSomething(),
ContinuationOption.AttachedToParent);
childTask.ContinueWith(() => followingMethod(),
ContinuationOption.AttachedToParent);
}
我知道如果“doSomething()”抛出并且异常childTask失败并且parentTask也因为失败而失败
ContinuationOption.AttachedToParent选项.
如果followingMethod()抛出异常,但parentTask状态为Completed,我会期望相同的行为.
我做错了还是继续任务的“父”任务不是我的“parentTask”?
解决方法:
你的直觉是正确的,但我猜你最有可能只使用错误的API.
我知道它只是伪代码,但Task.Start()是一个实例方法,而不是一个静态方法,所以不会按照你指示的方式编译,我们不知道你是如何实际启动的任务,细节都很重要. TaskFactory.StartNew会做你想要的,但Task.Run不会.试试这个:
Task parent = Task.Factory.StartNew(() =>
{
Task child = Task.Factory.StartNew(
() => { Console.WriteLine("foo"); },
TaskCreationOptions.AttachedToParent);
Task continuation = child.ContinueWith(
(Task prev) => { throw new InvalidOperationException("Test"); },
TaskContinuationOptions.AttachedToParent);
});
try
{
parent.Wait();
}
catch (AggregateException ex)
{
if (ex.Flatten().InnerException is InvalidOperationException)
{
Console.WriteLine("The continuation exception was propagated to parent");
}
}
如果你改变了
Task parent = Task.Factory.StartNew(...)
至
Task parent = Task.Run(...)
然后你不会得到你想要的行为,因为Task.Run本质上是TaskFactory.StartNew的包装器,其中(除其他外)指定了TaskCreationOptions.DenyChildAttach,因此两个嵌套任务都将分离运行(没有父项).我猜这就是你的问题所在.
内容总结
以上是互联网集市为您收集整理的c# – TPL继续任务:不确定谁是父任务全部内容,希望文章能够帮你解决c# – TPL继续任务:不确定谁是父任务所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。