Từ thông tin bạn' đã đưa ra, tôi hiểu bạn muốn có một mảng đầu ra của Foo với kích thước bằng với mảng đầu vào của byte? Điều này có đúng không?
Nếu vậy, có thao tác rất đơn giản. Đừng bận tâm với việc khóa hoặc đồng bộ các cấu trúc, chúng sẽ làm xói mòn tất cả tốc độ mà sự song song đó mang lại cho bạn.
Thay vào đó, nếu bạn tuân theo quy tắc đơn giản này bất kỳ thuật toán có thể được song song mà không cần khóa hoặc đồng bộ hóa:
Đối với mỗi yếu tố đầu vào X [i] xử lý, bạn có thể đọc từ bất kỳ yếu tố đầu vào X [j], nhưng chỉ viết thư cho yếu tố đầu ra Y [i]
Tra cứu Scatter/Thu thập, loại hình này hoạt động được gọi là một tập hợp như chỉ có một yếu tố đầu ra được ghi vào.
Nếu bạn có thể sử dụng nguyên tắc trên thì bạn muốn tạo mảng đầu ra Foo [] lên phía trước và sử dụng Parallel.For không ForEach trên mảng đầu vào.
Ví dụ:
List<byte[]> inputArray = new List<byte[]>();
int[] outputArray = new int[inputArray.Count];
var waitHandle = new ManualResetEvent(false);
int counter = 0;
Parallel.For(0, inputArray.Count, index =>
{
// Pass index to for loop, do long running operation
// on input items
// writing to only a single output item
outputArray[index] = DoOperation(inputArray[index]);
if(Interlocked.Increment(ref counter) == inputArray.Count -1)
{
waitHandle.Set();
}
});
waitHandler.WaitOne();
// Optional conversion back to list if you wanted this
var outputList = outputArray.ToList();
Nguồn
2012-06-20 10:07:50
đăng một số mã mẫu, vui lòng và để ghi lại những điều song song không nhất thiết phải nhanh hơn và hiệu quả hơn ... Wonder if Parallel.For sẽ giải quyết được sự cố của bạn. –
adt
Đây là một bản sao từ điều này: http://stackoverflow.com/questions/3639768/parallel-foreach-ordered-execution Vì vậy, để trả lời, bạn có thể sử dụng PLINQ (AsOrdered, AsParallel) để hoàn thành công việc. – Kadelka
Sẽ tốt hơn nếu có tương đương song song với 'Chọn' hoặc' Bản đồ' để giữ lại thứ tự đầu vào. – leppie