2009-05-08 62 views
10

Sự khác nhau giữa hai đoạn mã dưới đây là gì? Sẽ có bất kỳ vấn đề bằng cách sử dụng thứ hai?Biểu thức luồng và lambda

Kịch bản 1:

private void Log(Exception e) 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback(Log), e); 
} 

private void Log(object obj) 
{ 
    Exception e = (Exception)obj; 
    Logger.Log(e); 
} 

Kịch bản 2

private void Log(Exception e) 
{ 
    ThreadPool.QueueUserWorkItem(
     (obj) => 
      { 
       Logger.Log(e); 
      }); 
} 

Trong kịch bản 2, tôi không đi qua các ngoại lệ trong như một paramter để ThreadPool. Làm thế nào để marshalling thread của đối tượng ngoại lệ xảy ra? Sẽ có vấn đề gì không? Những hạn chế của việc này là gì nếu có? Ưu điểm lớn là bạn có thể vượt qua bất kỳ số tham số nào một cách dễ dàng.

Trả lời

14

Sự khác biệt duy nhất là trong trường hợp hai bạn đang đóng trên biến e có hiệu quả di chuyển biến ngăn xếp e thành loại tùy chỉnh được chuyển vào vùng đệm để bạn không bị mất.

Tôi nghĩ rằng điều này nên hoạt động tốt.

Chỉnh sửa: Về hiệu suất, không có sự khác biệt đáng kể nào giữa hai trường hợp. Trong trường hợp 1 bạn đã vượt qua ngoại lệ là state theo phương thức QueueUserWorkItem di chuyển nội bộ tham chiếu ngoại lệ đó lên vùng heap. Chi phí duy nhất là khi bạn sử dụng một đóng cửa là trình biên dịch tạo ra một loại cho bạn và lưu trữ bất kỳ biến bị bắt như các trường trên loại đó.

+0

Có bất kỳ tác động hiệu suất? –

+0

Câu trả lời hay. Thật vậy, biểu thức lambda tạo ra một đóng (http://en.wikipedia.org/wiki/Closure_(computer_science)) để biến (có thể nhiều hơn một trong trường hợp chung) có thể được tham chiếu ở nơi khác. – Noldorin

+0

@anon: Không, không nên có bất kỳ tác động hiệu suất nào theo như tôi biết. – Noldorin

1

Chỉ cần lưu ý, thay vì Lambda, bạn có thể làm tương tự với một phương pháp vô danh, và nó cũng sẽ làm việc trong C# 2.0:

ThreadPool.QueueUserWorkItem(delegate(Object e) 
    { 
     Logger.Log(e as Exception); 
    }); 
+0

+1 Những gì bạn đã đăng là chính xác những gì trình biên dịch tạo ra cho câu lệnh lambda trong câu hỏi của OP. –

+0

Có, nhưng nếu OP đã bao gồm nhiều tham số hơn, thì phương pháp ẩn danh có hoạt động không? –