2010-06-28 36 views
6

Tôi đang sử dụng ThreadPool với mã follwoing: -là gì => nhà điều hành trong mã này

ThreadPool.QueueUserWorkItem 
       (o => 
       MyFunction() 
       ); 

Tôi không chắc chắn những gì hiện o=> làm trong mã này. Bất cứ ai có thể giúp tôi ra ngoài.

+0

Tôi nghĩ bạn có nghĩa là '() => MyFunction()', đây là một lambda mà không có một tham số –

+0

@Mystere Man QueueUserWorkItem hy vọng một thể hiện của WaitCallback mà là một đại biểu cho phương pháp mà mất và đối tượng và trả về void . Vì vậy, trong khi lạ, chữ ký là chính xác. –

Trả lời

11

Nó mô tả hàm lambda (ẩn danh). Trong trường hợp này, nó là một hàm nhận một đối số, o và sau đó thực hiện MyFunction (mặc dù trong trường hợp này về cơ bản nó ném giá trị của o away). Nó tương đương với:

void Foo(object o) //We know that Foo takes an object and returns void because QueueUserWorkItem expects an instance of type WaitCallback which is a delegate that takes and object and returns void 
{ 
    MyFunction(); 
} 

ThreadPool.QueueUserWorkItem(Foo) // or ThreadPool.QueueUserWorkItem(new WaitCallback(Foo)); 

Loại o được suy ra dựa trên bất cứ điều gì QueueUserWorkItem hy vọng. QueueUserWorkItem mong đợi kiểu WaitCallback vì vậy trong trường hợp này o nên có kiểu đối tượng vì WaitCallback là đại biểu cho các phương thức với một tham số của kiểu đối tượng trả về void.

Đối với có nghĩa là của đoạn mã cụ thể này; về cơ bản bạn đang thêm một hàm (mục công việc) vào một hàng đợi sẽ được thực thi bởi một trong các luồng trong nhóm (khi nó trở nên có sẵn). Đoạn mã đặc biệt đó chỉ mô tả một cách tốt đẹp, ngắn gọn đi qua trong hàm mà không phải trải qua các rắc rối của việc định nghĩa đầy đủ một phương thức lớp.

Ngẫu nhiên, tôi và những người khác, có xu hướng đọc => là 'như vậy'. Một số người đọc nó là 'đi tới'.

+1

Chỉ cần làm rõ, => là toán tử và o là tham số được truyền vào. Hãy xem tại http://msdn.microsoft.com/en-us/library/bb397687.aspx để biết thêm chi tiết. – lzcd

+0

@lzcd: Tôi sẽ không gọi nó là nhà điều hành. Nó chỉ là cú pháp tách các tham số khỏi phần thân của lambda. – porges

+1

Nếu tôi hiểu chính xác thì nếu tôi muốn chuyển một số thông số vào chức năng của mình thì tôi có thể làm như sau: - ThreadPool.QueueUserWorkItem (o => MyFunction (o)); –

2

Nó khai báo một phương thức ẩn danh. Về cơ bản, bạn đang truyền một phương thức có thân là { MyFunction(); } làm tham số cho phương thức QueueUserWorkItem. Tôi chưa chọn, nhưng nó cũng phải tương đương với:

ThreadPool.QueueUserWorkItem(MyFunction); 
+2

Không hoàn toàn tôi không nghĩ. QueueUserWorkItem mong đợi một đại biểu chấp nhận một đối tượng làm đối số; do đó gói 'MyFunction' trong lambda. – Anthony

3

Đây là cú pháp C# cho biểu thức lambda.

Nó là bằng nhiều cách định nghĩa inline đại biểu. Nó giúp bạn tiết kiệm được sự tẻ nhạt của việc xác định một hàm phụ để sử dụng làm mục tiêu đại biểu.

private object Target(object state) { 
    MyFunction(); 
} 

... 
ThreadPool.QueueUserWorkItem(new WaitCallback(Target));