2009-03-17 31 views

Trả lời

12

Không rõ 100% những gì bạn đang yêu cầu.

Bạn có hỏi liệu lambdas có được chạy tự nhiên trên một chuỗi khác không?

Nếu không, chúng chỉ là một thể hiện khác của System.Delegate và chạy trên luồng chính trừ khi được yêu cầu cụ thể làm khác.

Bạn có hỏi liệu chúng có an toàn để chạy trên nhiều luồng không?

Đây là câu hỏi chỉ có thể được trả lời bằng cách biết nội dung của biểu thức lambda. Họ không phải là chủ đề an toàn. Theo kinh nghiệm của tôi, ít có khả năng là luồng an toàn hơn bạn mong đợi.

+0

Cảm ơn. Tôi đã hỏi # 1. –

+0

s/chủ đề chính/chủ đề hiện tại/như bất cứ nơi nào ủy quyền được thực hiện. – Richard

6

Không, chúng được thực hiện trên chuỗi chúng được tạo ra trừ khi bạn chuyển nó cho một chuỗi khác, giống như bất kỳ phương pháp nào khác. Bạn sẽ không muốn họ chạy trên một luồng khác một cách tự động, hãy tin tôi đi.

+0

vẻ thông thái: đó là chủ đề mà các đại biểu được thực hiện (ví dụ như tạo ra trên một sợi, vượt qua như tài liệu tham khảo khác và các đại biểu là thực hiện ở đó). – Richard

2

Vâng lambda chỉ là một phương thức ẩn danh, nó được thực hiện trên bất kỳ chuỗi nào nó được gọi trừ khi bạn cung cấp mã để thực thi trên một chuỗi riêng biệt.

3

Trong phiên bản tiếp theo của C#, họ đang thêm các tùy chọn đa luồng cho LINQ (được gọi là PLINQ) và các đại biểu. Xem thêm thông tin here. Hiện tại, tất cả chỉ là một chuỗi.

+0

Vâng, đó là về bất kỳ chủ đề * bạn * chọn để sử dụng ... không nhất thiết chỉ là một. –

+0

Ngoài ra tôi khá chắc chắn nó sẽ được hoàn toàn là một thư viện, không phải là một điều C# cụ thể. –

+0

Tôi có lẽ nên nói phiên bản tiếp theo của .net. xin lỗi. – Shawn

3

Như những người khác đã nói, biểu thức lambda không vốn đa luồng, cũng không làm các phương thức mở rộng LINQ-to-đối tượng tiêu chuẩn làm bất cứ điều gì đặc biệt để gọi chúng trong các luồng riêng biệt.

Tuy nhiên, nếu bạn muốn thực hiện một số chương trình đa luồng giống như LINQ, bạn nên xem Parallel Extensions to .NET Framework. Ngoài ra, hãy kiểm tra liên kết này:
http://blogs.msdn.com/pfxteam/

Thật không may, đây sẽ không phải là RTM cho đến khi VS2010/.Net4.0 hết.

2

Biểu thức Lambda chỉ là các phương pháp giống như bất kỳ cách nào khác. Điều gì làm cho một phương thức đa luồng?

  • Không truy cập vào các lĩnh vực bên ngoài (phương pháp đầu vào/đầu ra đơn giản) - một phương pháp như vậy luôn được đa luồng
  • Tiếp cận một lĩnh vực đồng bộ - xem xét kịch bản đồng bộ (Monitor lớp, khóa đọc/ghi, Interlocked truy cập, WaitHandle, vv), giảm thiểu sự tranh chấp khóa.
  • Tiếp cận một biến bị bắt (đóng cửa) - chắc chắn rằng biến bắt không thay đổi chừng nào đề khác sử dụng nó (làm thế nào biến được truy cập: chỉ đọc, đọc và viết ...)

Trình biên dịch C# đủ thông minh để biết liệu các phương thức tĩnh hay các cá thể được tạo ra cho các lambdas của bạn.

+0

Cảm ơn. Khi bạn nói "Điều gì làm cho một phương thức đa luồng?", Bạn có nghĩa là những nguyên tắc này làm cho nó thread an toàn hoặc đa luồng khi thực hiện? –

+0

Tôi có nghĩa là đa luồng là chủ đề an toàn. Nếu một phương thức (hoặc lambda) được gọi từ các luồng khác nhau, nó được thực hiện riêng biệt trong mỗi luồng, nghĩa là mỗi luồng có ngăn xếp cuộc gọi riêng của nó. –

2

Câu trả lời có khả năng gây nhầm lẫn (nhưng đúng).Trong một số trường hợp thường gặp, một lambda có thể thực thi trên một máy khác, trong một môi trường thời gian chạy hoàn toàn khác, và do đó trên một luồng khác, và người gọi không nhất thiết phải chờ thực hiện từ xa đầy đủ trước khi tiếp tục.

(Cụ thể, nếu bạn vượt qua nó vào một LINQ to truy vấn SQL.)

+0

Điểm tốt, ngay cả khi không thực hiện trực tiếp và phi địa phương nhất – Pierreten

Các vấn đề liên quan