我一直在研究子任务,而不是使用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!");
}
答案 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();