2008-10-10 11 views
6

Tôi có một ứng dụng .NET xử lý khoảng 300.000 bản ghi trong một đợt nhập, và phải mất một vài giây cho mỗi bản ghi vì vậy tôi muốn song song điều này. Trong đoạn mã sau, sự khác biệt giữa ProcessWithAnsycDelegates()ProcessWithThreadPool() là gì?Sử dụng các đại biểu không đồng bộ hoặc ThreadPool.QueueUserWorkItem cho chủ nghĩa song song lớn?

public class ResultNotification 
{ public EventHandler event Success; 
    public EventHandler event Fail; 
    internal void Notify(bool sucess) {if (success) Success(); else Fail();} 
} 

public static class Processor 
{ public ResultNotification ProcessWithAnsycDelegates(Record record) 
    { var r = new ResultNotification(); 
     Func<Record,bool> processRecord=new RecordProcessor().ProcessRecord; 
     processRecord.BeginInvoke 
        (record 
         ,ar => result.Notify(processRecord.EndInvoke(ar)) 
         ,null); 
     return r;  
    } 

    public ResultNotification ProcessWithThreadPool(Record r) 
    { var r = new ResultNotification(); 
     var rp = new RecordProcessor(); 
     ThreadPool.QueueWorkUserItem(_=>result.Notify(rp.ProcessRecord(r))); 
     return r; 
    } 
} 

Trả lời

6

Trong trường hợp này, không nhiều khi cả hai đều sử dụng threadpool dưới mui xe. Tôi muốn nói rằng QueueUserWorkItem() dễ đọc hơn và xem những gì đang xảy ra so với BeginInvoke.

Liên kết này có thể hữu ích. Đó là thông tin cũ hơn, nhưng vẫn chủ yếu áp dụng được http://www.yoda.arachsys.com/csharp/threads/threadpool.shtml

+0

Những phần không được áp dụng? – bzlm

7

Câu trả lời cho câu hỏi là cả hai đều sử dụng threadpool, vì vậy sự khác biệt không nhiều nếu hiệu suất là chỉ xem xét.

Nếu câu hỏi thực sự là nhận được hiệu suất tốt nhất, thì có thể giúp bạn biết rằng việc sử dụng threadpool không có vấn đề gì. Chúng bao gồm:

  • Khóa ganh đua trên hàng đợi công việc
  • Quá bối cảnh chuyển đổi. Nếu bạn có 2 CPU và một chuỗi các mục công việc thì 25 luồng không thực sự hữu ích. Tốt hơn để có 2 bài, một cho mỗi CPU

Nó có thể là giá trị điều tra các TPL và PLINQ:

Một ví dụ họ cung cấp cho TPL đang sử dụng là:

for (int i = 0; i < 100; i++) { 
    a[i] = a[i]*a[i]; 
} 

tới:

Parallel.For(0, 100, delegate(int i) { 
    a[i] = a[i]*a[i]; 
});