2010-06-28 2 views
6

Я использую ThreadPool с кодом происходит некорректно: -Что такое => оператор в этом коде

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

Я не уверен, что делает o=> делает в этом коде. Может кто-нибудь мне помочь.

+0

Я думаю, что вы имеете в виду '() => MyFunction()', это лямбда без параметра –

+0

@Mystere Man QueueUserWorkItem ожидает экземпляр WaitCallback, который является делегатом методов, которые принимают и возвращают объект и пустота , Итак, хотя это странно, подпись правильная. –

ответ

11

В нем описывается функция лямбда (анонимность). В этом случае это функция, которая принимает один аргумент, o, а затем выполняет MyFunction (хотя в этом случае она в основном бросает значение o). Это эквивалентно:

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)); 

Тип вывода вывод основан на то, что QueueUserWorkItem ожидает. QueueUserWorkItem ожидает тип WaitCallback, поэтому в этом случае o должен быть объекта типа, потому что WaitCallback является делегатом для методов с одним параметром объекта типа, который возвращает void.

Что касается значения данного фрагмента кода; вы в основном добавляете функцию (рабочий элемент) в очередь, которая будет выполняться одним из потоков в пуле (когда она станет доступной). Этот фрагмент кода просто описывает хороший, лаконичный способ передачи функции без необходимости решать проблему полного определения метода класса.

Кстати, я и другие, как правило, читают => как «такие, что». Некоторые люди читают его как «идет».

+1

Просто для уточнения, => является оператором, а o является передаваемым параметром. За дополнительной информацией обратитесь к http://msdn.microsoft.com/en-us/library/bb397687.aspx. – lzcd

+0

@lzcd: Я бы не назвал это оператором. Это просто синтаксис, который отделяет параметры от тела лямбда. – porges

+1

Если я правильно понял, то, если я хочу передать некоторые параметры моей функции, тогда я могу сделать это следующим образом: - ThreadPool.QueueUserWorkItem (o => MyFunction (o)); –

2

Это объявление анонимного метода. В принципе, вы передаете метод, тело которого равно { MyFunction(); } в качестве параметра для метода QueueUserWorkItem. Я не проверял, но это также должно быть эквивалентно:

ThreadPool.QueueUserWorkItem(MyFunction); 
+2

Не совсем я не думаю. QueueUserWorkItem ожидает делегата, который принимает один объект в качестве аргумента; следовательно, обертывание 'MyFunction' в лямбда. – Anthony

3

Это синтаксис C# для выражения лямбда.

Это во многих отношениях определение рядного делегата. Это избавляет вас от утомительности определения дополнительной функции для использования в качестве цели для делегата.

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

... 
ThreadPool.QueueUserWorkItem(new WaitCallback(Target)); 
Смежные вопросы