2014-01-24 4 views
1

У меня есть функция называется: Request(out response,string a), которая возвращает булевы Я хочу, чтобы запустить его в нескольких потоках, так что я написал:Смарт пула потоков для начинающих

ThreadPool.QueueUserWorkItem(new WaitCallback(Calss.Request), ""); 

(я не уверен, что синтаксис справа) но VS продолжают говорить мне, что функция должна быть пустота, как возвращение

'expect a method with void request(object)' signature 

, как я могу сделать?

+0

Когда вы помещаете это в несколько потоков, что вы собираетесь делать с возвращенным bool из 'Request' и значением' response'? Пожалуйста, добавьте больше кода, чтобы показать, как вы используете код, не являющийся потоком, и мы можем вам помочь. –

+1

Какая версия .NET вы используете? Класс 'Task' и' Task 'класс намного проще в использовании, если вы можете их использовать. –

+0

Каков тип ответа? А также вы должны дать два аргумента. И метод должен возвращать пустоту. – Knerd

ответ

4

Это случай, когда это помогает немного посмотреть на документацию. Для метода ThreadPool.QueueUserWorkItem требуется делегат WaitCallback. Вам нужно передать ему метод запуска, который принимает один объект, и объект для использования в качестве параметра для метода.

Ваш метод не имеет такой же подписи, как и обратный вызов. Метод имеет ту же подпись, что и делегат Action<Object>.

Вам придется написать метод оболочки для метода, который вы хотите запустить, который имеет подпись необходимое:

void WrapperMethod(object state) 
{ 
    string a = state.ToString(); 
    string response; // whatever this out parameter is... 
    Class.Request(out response,a); 
} 

, а затем настроить тему:

ThreadPool.QueueUserWorkItem(WrapperMethod, ""); 

компилятор фактически настроил делегата для вас. Если вы работаете в .Net 4.5, вы можете использовать Task.Run:

Task.Run(()=> Request(out response, a)); 

Хотя смешивание Task.Run и из параметров не рекомендуется.

+0

TPL также доступен в .net 4.0;) – Knerd

+0

Yup, вам нужно использовать синтаксис 4.0 ('Task.Factory.StartNew()') –

Смежные вопросы