Ошибка ThreadPool.QueueUserWorkItem при запуске метода в отдельном потоке в c # 2.0

#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. как передать аргумент метода, если требуется, потому что вы сказали мне не указывать скобки, я имею в виду (). пожалуйста, покажите мне решение с примером кода.