2010-04-19 35 views
7

Chúng ta có đoạn mã sau đây (ý tưởng cho mã này được tìm thấy trên trang web này) sẽ sinh ra các luồng mới cho phương thức "Do_SomeWork()". Điều này cho phép chúng tôi chạy phương thức nhiều lần không đồng bộ.C# Execute Method (with Parameters) với ThreadPool

Mã này là:

var numThreads = 20; 
    var toProcess = numThreads; 

    var resetEvent = new ManualResetEvent(false); 

    for (var i = 0; i < numThreads; i++) 
    { 
     new Thread(delegate() 
     { 
      Do_SomeWork(Parameter1, Parameter2, Parameter3); 
      if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set(); 
     }).Start(); 
    } 

    resetEvent.WaitOne(); 

Tuy nhiên chúng tôi muốn tận dụng ThreadPool hơn là tạo chủ đề mới của chúng ta mà có thể gây phương hại đến hiệu suất. Câu hỏi là làm thế nào chúng ta có thể sửa đổi mã trên để sử dụng ThreadPool lưu ý rằng phương thức "Do_SomeWork" lấy nhiều tham số và cũng có kiểu trả về (tức là phương thức không bị vô hiệu).

Ngoài ra, đây là C# 2.0.

Trả lời

8

Khá nhiều theo cùng một cách , nhưng sử dụng WaitCallback được chuyển đến ThreadPool.QueueUserWorkItem:

var numThreads = 20; 
var toProcess = numThreads; 

var resetEvent = new ManualResetEvent(false); 

for (var i = 0; i < numThreads; i++) 
{ 
    ThreadPool.QueueUserWorkItem (
     new WaitCallback(delegate(object state) { 
     Do_SomeWork(Parameter1, Parameter2, Parameter3); 
     if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set(); 
    }), null); 
} 

resetEvent.WaitOne(); 
+0

Chỉ cần suy nghĩ nếu nó thực sự tuyệt vời để chạy các phương thức của bạn trên gọi lại trong khi truyền các đối tượng null/taskInfo – electricalbah

1

Với C# 2.0, bạn gọi

ThreadPool.QueueUserWorkItem(callback, new object[] { parm1, parm2, etc }); 

Sau đó bên trong gọi lại bạn cast đối tượng [] trở lại vào các thông số chính xác và các loại. Về kiểu trả về, nếu sử dụng ThreadPool Tôi không nghĩ rằng bạn sẽ có thể để có được giá trị trả về, gọi lại phải có chữ ký của

void Callback (object parm)