Я использую ThreadPool с кодом follwoing:-
ThreadPool.QueueUserWorkItem
(o =>
MyFunction()
);
Я не уверен, что делает o=>
делает в этом коде. Может любой выручать меня.
Здесь описывается лямбда (анонимная) функция. В данном случае это функция, которая принимает один аргумент, 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));
Тип o определяется на основе того, что ожидает QueueUserWorkItem. QueueUserWorkItem ожидает тип WaitCallback, поэтому в данном случае o должен быть типа object, так как WaitCallback является делегатом для методов с одним параметром типа object, которые возвращают void.
Что касается смысла этого конкретного фрагмента кода, то, по сути, вы добавляете функцию (рабочий элемент) в очередь, которая будет выполнена одним из потоков в пуле (когда он станет доступен). Этот конкретный фрагмент кода просто описывает хороший, лаконичный способ передачи функции без необходимости полностью определять метод класса.
Кстати, я, да и другие, склонны читать => как 'such that'. Некоторые люди читают его как 'goes to'.
Это синтаксис C # для лямбда-выражения.
Во многих отношениях это определение встроенного делегата. Это избавляет вас от утомительного определения дополнительной функции для использования в качестве цели делегата.
private object Target(object state) {
MyFunction();
}
...
ThreadPool.QueueUserWorkItem(new WaitCallback(Target));
Он объявляет анонимный метод. По сути, вы передаете метод, тело которого - {MyFunction (); }
в качестве параметра метода QueueUserWorkItem. Я не проверял, но он также должен быть эквивалентен:
ThreadPool.QueueUserWorkItem(MyFunction);