2012-06-06 3 views
3

Я пытаюсь запустить задачу в C#, которая принимает параметр и возвращает значение, но я не могу получить синтаксис правильно.Как запустить задачу, которая принимает параметр и возвращает значение?

Вот как близко, как я получил: вот задача, которая, как ожидается, вернет int. Я моя лямбда, я также показывать его принимать один параметр, о:

Task<int> task1 = Task.Factory.StartNew<int>((o) => { return 2 ; }, 3); 
Console.WriteLine(task1.Result); // prints 2 

выше линия работает (она возвращает жёстко прописанное значение 2, но вы можете видеть, что это не делает ничего с параметром а , что делает его бесполезным Если я что-то сделать с параметром а, как это:.

Task<int> task1 = Task.Factory.StartNew<int>((o) => { return (2 * o) ; }, 3); 

я получаю сообщение, что синтаксис делегат «System.Func» не принимает 1 аргументы

Любая помощь в том, как. для достижения обеих вещей (передать параметр и получить значение) из задачи будет отлично!

ответ

0

Theres Task<t> Вы можете использовать (смотрите here) T - это возвращаемое значение, конечно. По параметру - вы можете просто использовать ur-переменные в анонимном делетете, поэтому, если у вас есть int o, определенный вне задачи, вы можете просто использовать его в заданной области анонимного делегирования. вы можете увидеть образец here

+0

Итак, вы говорите, что не указываете параметры лямбда .. правильно? Другими словами, вместо (o) => ..do что-то с o объявить временным для хранения o вне самой задачи, а затем просто использовать() => ..do что-то с o –

+0

'task ' class принимает делегат Func, который либо не получает никаких параметров, а возвращает T, или принимает и возвращает объект, и возвращает T. вы, вероятно, можете использовать перегрузку объекта, как описано в msdn, но для этого нет причин. Любой анонимный/лямбда-делегат, который вы пишете в .net, также имеет доступ к переменным области, определяемой им, как вы можете видеть в ссылке, которую я предоставил/ответил Николас Батлерс. Вам не нужно указывать параметры в лямбда, yup. – YavgenyP

3

Параметр ввода (состояние) для Task может быть только типа object, так что это на самом деле не типобезопасен.

Параметр типового типа на Task<T> является типом возврата Task.

Наилучшим вариантом является использование окончания:

int i = 3; 
Task<int> task1 = Task.Factory.StartNew(() => 2 * i); 
3

o является состояние объекта, и в вашем случае, это значение, которое вы передаете в или 3. Вы можете бросить его в int.

Task<int> task = Task.Factory.StartNew<int>(o => { 
    return 2 * (int)o; 
}, 3); 

Console.WriteLine(task.Result); // prints 6 

См. Документацию к msdn по адресу TaskFactory. StartNew который гласит:

состояние

Тип: System.Object

Объект, содержащий данные, которые будут использоваться функцией делегата.

+1

Это работает, но использование закрытия лучше в большинстве случаев. – svick

+0

@svick Я согласен, я просто пытался ответить на вопрос OP. –

+0

это только я или у него было бы больше смысла включать спецификацию типа параметра в общие типы подписи, по крайней мере, как дополнительную перегрузку (-ы)? –

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