2012-02-22 2 views
5

Tôi có một phương pháp foreach như thế này:Làm thế nào để viết Parallel.ForEach với một tham số cố định và một tham số khác từ bộ sưu tập?

public void Initialize(ClassB fixed) 
{ 
    foreach (ClassA item in itemCollection) 
    { 
     this.InitializeStock(fixed, item); 
    } 
}   

Tôi muốn sử dụng một Parallel.ForEach với cái này nhưng không chắc chắn về cách để làm điều đó. Tôi không thể thiết lập tham số cố định như một thuộc tính lớp như phương thức khởi tạo đã được gọi từ một Parallel.ForEach khác.

Xin cảm ơn trước.

Trả lời

11

Không rõ vấn đề là gì. Điều này cần được tốt:

public void Initialize(ClassB fixed) 
{ 
    Parallel.ForEach(itemCollection, item => 
    { 
     this.InitializeStock(fixed, item); 
    }); 
} 

Biến fixed sẽ được chụp bởi biểu thức lambda để nó có thể được sử dụng khi gọi InitializeStock.

EDIT: Nếu bạn thực sự không muốn biểu thức lambda:

private class ClassBHolder 
{ 
    private readonly ClassB fixed; 
    // Foo is the class which has the Initialize method 
    private readonly Foo container; 

    internal ClassBHolder(ClassB fixed, Foo container) 
    { 
     this.fixed = fixed; 
     this.container = container; 
    } 

    internal void Execute(ClassA item) 
    { 
     container.InitializeStock(fixed, item); 
    } 
} 

public void Initialize(ClassB fixed) 
{ 
    ClassBHolder holder = new ClassBHolder(fixed, this); 
    Parallel.ForEach(itemCollection, holder.Execute); 
} 

... nhưng thực sự, mà sẽ bạn chứ không phải đọc?

+0

Ồ, tôi đã cố gắng để gọi Parallel.ForEach truyền trực tiếp một đại biểu. Sẽ thử giải pháp này. Dù sao thì tôi cũng không thích các phương thức nặc danh. Điều này có thể thực hiện được với các phương pháp thông thường và một đại biểu không? –

+4

@SoMoS: Bạn nên học cách nắm lấy các phương thức ẩn danh; có _extremely_ hữu ích. Nếu bạn thực sự không muốn, bạn sẽ cần tạo một lớp riêng biệt, [cách trình biên dịch thực hiện] (http://blog.slaks.net/2011/06/delegates-vs-function-pointers-part -4-c.html) cho bạn khi bạn sử dụng một phương thức nặc danh. – SLaks

+0

@SLaks: vâng, tôi đã kết thúc bằng một dòng ẩn danh nên tôi cảm thấy ổn với nó. Các phương thức vô danh khiến tôi dành nhiều thời gian hơn để hiểu những gì đang diễn ra. Nhưng tôi đồng ý rằng đôi khi chúng tốt (như thế này). –

0

đây thử điều này:

public void Initialize(ClassB fixed) 
{ 
    Parallel.ForEach(itemCollection, new ParallelOptions() { MaxDegreeOfParallelism = 100 }, 
       (item, i, j) => 
        { 

         this.InitializeStock(fixed, item); 

        }); 
}