gpt4 book ai didi

c# - 为什么 Parallel.Invoke 无法完成所有操作?

转载 作者:太空宇宙 更新时间:2023-11-03 20:40:00 25 4
gpt4 key购买 nike

我在有关 C# 并行编程的教科书中编写了一个示例。书中建议Parallel.Invoke可以替代任务的创建、调用和等待。但是,我尝试并发现如果我使用 Parallel.Invoke,任务将不会在返回值之前完成。但理论上,Parallel.Invoke 应该一直等待。

代码:

    private byte[] getDataForGraph(int dataSize)
{
byte[] data = new byte[dataSize];


Parallel.Invoke(
() => Task.Factory.StartNew(() => generateGraphData(data, 0, pixelWidth / 8)),
() => Task.Factory.StartNew(() => generateGraphData(data, pixelWidth / 8,
pixelWidth / 4)),
() => Task.Factory.StartNew(() => generateGraphData(data, pixelWidth / 4,
pixelWidth * 3 / 8)),
() => Task.Factory.StartNew(() => generateGraphData(data, pixelWidth * 3 / 8,
pixelWidth / 2)));

return data;
}

以及函数的执行方式:

Task<byte[]> getDataTask = Task<byte[]>.Factory.StartNew(() => getDataForGraph(dataSize));
byte[] data = getDataTask.Result;

private void generateGraphData(byte[] data, int partitionStart, int partitionEnd) 是一个填充数据数组的函数,从 partitionStart 到 partitionEnd。

如果我运行程序,只有数组的一部分被填充。但是如果我用

替换 Invoke
Task first = Task.Factory.StartNew(() => generateGraphData(data, 0, pixelWidth / 8));
Task second = Task.Factory.StartNew(() => generateGraphData(data, pixelWidth / 8, pixelWidth / 4));
Task third = Task.Factory.StartNew(() => generateGraphData(data, pixelWidth / 4, pixelWidth * 3 / 8));
Task fourth = Task.Factory.StartNew(() => generateGraphData(data, pixelWidth * 3 / 8, pixelWidth / 2));
Task.WaitAll(first, second, third, fourth);

程序按预期运行(数组已满)。

这里可能是什么问题?

提前致谢。

最佳答案

它执行操作 直到它们完成。在您的情况下,每个操作都是调用 Task.Factory.StartNew(...) - that 已完成;但是,不能保证这些任务中的每一个都已排队/处理。不同之处在于 WaitAll(您尚未在 Parallel 示例中调用它)。

这里的一个选择是将其减少为:

Parallel.Invoke(
() => generateGraphData(data, 0, pixelWidth / 8),
() => generateGraphData(data, pixelWidth / 8, pixelWidth / 4),
() => generateGraphData(data, pixelWidth / 4, pixelWidth * 3 / 8),
() => generateGraphData(data, pixelWidth * 3 / 8, pixelWidth / 2)
);

关于c# - 为什么 Parallel.Invoke 无法完成所有操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3377266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com