为了账号安全,请及时绑定邮箱和手机立即绑定

问题创建子任务

问题创建子任务

C#
慕少森 2021-11-28 17:43:30
我一直在使用 C# 书籍查看子任务,而不是嵌套任务。以下示例是书中所说的,但是当我尝试完全相同的代码时,它返回一个错误:并非所有代码路径都返回类型为“Func”的 lambda 表达式中的值。现在我已经检查了 10 多次我是否没有打错字或任何东西。但它完全一样。我查了一些关于这个的问题,我发现通常添加“return”语句可以修复这个错误(在“Task”之前)。但是添加 return 并没有解决我的问题。有人可以解释一下问题是什么吗?(下面的代码授予我错误)public void RunChildTask2()    {        Task parent = Task.Run(() =>        {            Console.WriteLine("Parent task starting...");            Task child = Task.Run(() =>            {                Console.WriteLine("Child task starting...");                Thread.Sleep(1000);                Console.WriteLine("Child task completed!");            }, TaskCreationOptions.AttachedToParent);        });        parent.Wait();        Console.WriteLine("Parent task completed!");    }
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

TaskCreationOptions调用时无法指定Task.Run。你需要使用


Task.Factory.StartNew(() => {/*...*/}, TaskCreationOptions.AttachedToParent, default(CancellationToken), TaskScheduler.Default)

顺便说一下,Task.Run默认情况下设置TaskCreationsOptions为DenyChildAttach,因此如果您想要一个子任务,您还需要TaskCreationOptions为父任务指定。所以它看起来像这样:


Task parent = Task.Factory.StartNew(() =>

{

    Console.WriteLine("Parent task starting...");

    Task child = Task.Factory.StartNew(() =>

    {

        Console.WriteLine("Child task starting...");

        Thread.Sleep(1000);

        Console.WriteLine("Child task completed!");

    }, TaskCreationOptions.AttachedToParent, default(CancellationToken), TaskScheduler.Default);

}, TaskCreationOptions.None, default(CancellationToken), TaskScheduler.Default);

parent.Wait();


查看完整回答
反对 回复 2021-11-28
  • 1 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信