创建子任务时出现问题

时间:2018-08-14 17:04:56

标签: c# task

我一直在研究子任务,而不是使用C#书的嵌套任务。 这本书说的是以下示例,但是当我尝试完全相同的代码时,它将返回错误: 并非所有的代码路径都会在lambda表达式中返回“ Func”类型的值。

现在,我已经检查了十多次,我是否没有错字或其他任何内容。但是完全一样。

我查询了一些与此相关的问题,发现通常添加“ return”语句可以修复此错误(在“ Task”前面)。 但是添加退货并不能解决我的问题。

有人可以解释问题所在吗? (下面的代码向我授予错误)

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 个答案:

答案 0 :(得分:0)

调用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();