Dim*_*tri 7 .net c# task-parallel-library
所以这是我的代码
Task<int[]> parent = Task.Run(() =>
{
var result = new int[3];
TaskFactory tf = new TaskFactory(TaskCreationOptions.AttachedToParent, TaskContinuationOptions.ExecuteSynchronously);
for (int i = 0; i < result.Length; i++)
{
int j = i;
tf.StartNew(() => result[j] = GetRandomNumber(j));
}
return result;
});
var finalTask = parent.ContinueWith(parentTask =>
{
foreach (var i in parentTask.Result)
{
Console.WriteLine(i);
}
});
finalTask.Wait();
Run Code Online (Sandbox Code Playgroud)
基本上我创建3 Tasks,这是Task被叫父母的孩子(我猜).我要求父任务等待所有三个子任务完成.之后,由于finalTask这种状态,将等待执行finalTask.Wait();.但事情并没有像预期的那样发生.我的意思是应用程序在任何GetRandomNumber调用完成之前退出.这里的代码的某些部分是从书中复制的,该书表明那些父任务应该等待子任务完成,这显然没有发生.我在这里错过了什么吗?
这就是GetRandomNumber所做的
public static int GetRandomNumber(int ii)
{
Random rand = new Random();
for (int i = 0; i < 1000000000; i++) { } // imitate some jobs
return rand.Next(1000);
}
Run Code Online (Sandbox Code Playgroud)
这段代码做了同样的事情
Task<int[]> parent = Task.Run(() =>
{
var result = new int[3];
for (int i = 0; i < result.Length; i++)
{
int j = i;
new Task(() => result[j] = GetRandomNumber(j), TaskCreationOptions.AttachedToParent).Start();
}
return result;
});
Run Code Online (Sandbox Code Playgroud)
Dou*_*las 13
此行为是由于您使用该Task.Run方法,该方法禁止将子任务附加到父级:
该
Run方法是该方法的简单替代方案StartNew.它创建一个任务[其CreationOptions属性值]TaskCreationOptions.DenyChildAttach.
要解决此问题,只需更改第一行即可
Task<int[]> parent = Task.Run(() =>
Run Code Online (Sandbox Code Playgroud)
至
Task<int[]> parent = Task.Factory.StartNew(() =>
Run Code Online (Sandbox Code Playgroud)