#c#
#c#
Вопрос:
я получил код для вызова любого метода через поток.
System.Threading.ThreadPool.QueueUserWorkItem(Export());
здесь я попытался запустить метод Export () через поток и получил ошибку компиляции. что не так в коде. я использую версию c # 2.0. пожалуйста, помогите.
Ответ №1:
Export
Возвращает ли метод делегат типа WaitCallback
? Если нет, то вы указываете неправильный параметр QueueUserWorkItem
. Чтобы было понятно, вам необходимо предоставить делегат, соответствующий следующей подписи:
public delegate void WaitCallback(
Object state
)
Итак, метод Export
должен иметь следующую подпись:
public void Export(object state)
и должен быть предоставлен QueueUserWorkItem
следующим образом:
ThreadPool.QueueUserWorkItem(Export)
или, если Export
имеет другую подпись, вы могли бы использовать промежуточный делегат для его вызова:
ThreadPool.QueueUserWorkItem(state=>Export())
или, если Export
требуются параметры, вы могли бы:
ThreadPool.QueueUserWorkItem(state=>Export(some,parameters))
Ответ №2:
QueueUserWorkItem
принимает делегат, но вы вызываете Export
метод, а затем пытаетесь передать результат Export
в QueueUserWorkItem
метод. Другими словами, это как если бы вы запускали:
var result = Export();
ThreadPool.QueueUserWorkItem(result);
Это явно не будет выполняться Export
в другом потоке…
Предполагая, что сигнатура Export
метода верна, вам просто нужно изменить ее с вызова метода на преобразование группы методов:
ThreadPool.QueueUserWorkItem(Export);
РЕДАКТИРОВАТЬ: Если вам нужно предоставить аргументы методу Export, самый простой способ сделать это — использовать лямбда-выражение (при условии, что вы используете C # 3). Например:
ThreadPool.QueueUserWorkItem(state => Export(filename));
Комментарии:
1. как передать аргумент метода, если требуется, потому что вы сказали мне не указывать скобки, я имею в виду (). пожалуйста, покажите мне решение с примером кода.
2. @Thomas: Смотрите мою правку. Но действительно важно, чтобы вы действительно понимали , что здесь происходит — возможно, вы захотите ознакомиться с делегатами в целом и лямбда-выражениями в частности.
Ответ №3:
Вероятно, вам придется написать ThreadPool.QueueUserWorkItem(new WaitCallback(Export))
и изменить export, чтобы иметь единственный параметр типа object, т.Е.:
Export(object state)
{
......
}
состояние — это параметр, который вы можете передать функции обратного вызова при вызове QueueUserWorkItem()
Ответ №4:
Предоставление Export
соответствует делегату, который должен быть предоставлен в QueueUserWorkItem
do:
ThreadPool.QueueUserWorkItem(Export);
Заключая Export()
в круглые скобки, вы вызываете метод вместо передачи в QueueUserWorkItem
для вызова в отдельном потоке.
Комментарии:
1. как передать аргумент метода, если требуется, потому что вы сказали мне не указывать скобки, я имею в виду (). пожалуйста, покажите мне решение с примером кода.