所以下面是我的代码。
基本上,我创建了3个子任务,它们是名为父任务的Task的子任务(我猜测)。我期望父任务等待所有三个子任务完成。之后,由于`finalTask.Wait();`这个语句,`finalTask`将等待执行。但事情并没有按照预期发生。我的意思是,在任何一个`GetRandomNumber`调用完成之前,应用程序就退出了。此处的代码有一部分是从书中复制的,该书指出这些父任务应该等待子任务完成,但显然并没有发生。我在这里漏掉了什么吗?
以下是"GetRandomNumber"函数的内容:
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();
基本上,我创建了3个子任务,它们是名为父任务的Task的子任务(我猜测)。我期望父任务等待所有三个子任务完成。之后,由于`finalTask.Wait();`这个语句,`finalTask`将等待执行。但事情并没有按照预期发生。我的意思是,在任何一个`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);
}
这段代码实现了同样的功能。
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;
});