Điều này có phù hợp với bạn không?
public static class Parallel
{
public static void ForEach<T>(IEnumerable<T>[] sources,
Action<T> action)
{
foreach (var enumerable in sources)
{
ThreadPool.QueueUserWorkItem(source => {
foreach (var item in (IEnumerable<T>)source)
action(item);
}, enumerable);
}
}
}
// sample usage:
static void Main()
{
string[] s1 = { "1", "2", "3" };
string[] s2 = { "4", "5", "6" };
IEnumerable<string>[] sources = { s1, s2 };
Parallel.ForEach(sources, s => Console.WriteLine(s));
Thread.Sleep(0); // allow background threads to work
}
Đối với C# 2.0, bạn cần chuyển đổi biểu thức lambda ở trên thành đại biểu.
Lưu ý: Phương pháp tiện ích này sử dụng chủ đề nền. Bạn có thể muốn sửa đổi nó để sử dụng các chủ đề tiền cảnh, và có lẽ bạn sẽ muốn đợi cho đến khi tất cả các chủ đề kết thúc. Nếu bạn làm điều đó, tôi đề nghị bạn tạo các chủ đề sources.Length - 1
và sử dụng chuỗi thực thi hiện tại cho nguồn cuối cùng (hoặc trước tiên).
(Tôi ước gì có thể bao gồm chờ đợi đề để kết thúc trong mã của tôi, nhưng tôi xin lỗi mà tôi không biết làm thế nào để làm điều đó được nêu ra. Tôi đoán bạn nên sử dụng một WaitHandle
Thread.Join()
.)
Nguồn
2009-02-07 08:15:51
wouldn' một vòng lặp for là giải pháp đơn giản hơn, ngắn hơn, dễ đọc hơn thay vì phản hồi Kết hợp bên dưới? lý do của bạn cho thích foreach trong trường hợp này là gì – Gishu
Cũng song song lặp lại chỉ nổi lên trong Ruby 1.9 vì vậy tôi muốn đặt cược vào nó không được trong C# như của bây giờ .. LISP đã có nó mặc dù :) – Gishu
Tôi không chắc tôi hiểu câu hỏi đúng. Bạn đang cố gắng lặp qua nhiều bảng số song song, hoặc bạn đang cố gắng lặp qua một số đếm, xử lý các mục khác nhau song song? –