Tôi biết rằng các biểu thức lambda .NET có thể nắm bắt các biến bên ngoài. Tuy nhiên, tôi đã nhìn thấy nó rất nhiều lần các biến được chuyển một cách rõ ràng đến biểu thức lambda như một tham số, và thư viện .NET cũng có vẻ hỗ trợ (ví dụ: ThreadPool.QueueUserWorkItem).Biểu thức Lambda, các biến được chụp và luồng
Câu hỏi của tôi là những hạn chế của những ảnh chụp này là gì? Làm thế nào về lambdas được thực sự thực hiện trên một chủ đề khác nhau hơn là một trong họ đã được tạo ra trên (ví dụ như ThreadPool.QueueUserWorkItem, hoặc Thread), hoặc lambas hoạt động như callbacks (tức là được gọi vào một thời gian sau đó)?
Nói chung, khi nào tôi nên dựa vào các biến bị bắt và khi nào nên sử dụng các thông số rõ ràng? Ví dụ:
public void DoStuff()
{
string message = GetMessage();
ThreadPool.QueueUserWorkItem(s => SendMessage(message)); // use captured variable
// -- OR --
ThreadPool.QueueUserWorkItem(s =>
{
string msg = (string)s;
SendMessage(msg);
}, message); // use explicit parameter
}
Cảm ơn bạn!
Cập nhật: cố định ví dụ ThreadPool.QueueUserWorkItem thứ hai.
Bạn nói đúng, tôi đã bỏ lỡ thông số trong phần thứ hai của ví dụ. Vì vậy, như tôi hiểu, trong thực tế nó không thực sự quan trọng mà tôi sử dụng, nhưng bạn muốn giới thiệu tôi với đi với các biến bị bắt, vì đơn giản (và dễ đọc). Cảm ơn bạn rất nhiều vì câu trả lời chi tiết của bạn! – ShdNx