Как запустить задачу, возвращающую значение и принимающую параметр? Я вижу, что существует перегруженный метод Task.Run<TResult>(Func<TResult>)
, но как я могу передать там параметр?
Task.Run и Func <>
Ответ 1
Func<TResult>
не принимает параметр. Как правило, вы должны захватить параметр, используя выражение лямбда вместо этого. Например:
public void DoSomething(string text)
{
Task<int> task = Task.Run(() => text.Length);
...
}
Здесь text
- захваченная переменная... поэтому, даже если вы просто создаете Func<int>
, она использует параметр метода.
Ответ 2
Вы можете использовать перегрузки Task.Factory.StartNew() для передачи в "состоянии" объекта, который содержит все параметры, которые вы хотите использовать. Здесь очень простой пример, проходящий в NameValueCollection, но вы, очевидно, можете передать любой тип объекта, который вам нужен.
Task<bool>.Factory.StartNew(
( a ) => {
NameValueCollection nvc = a as NameValueCollection;
if( nvc != null ) {
nvc.AllKeys.ForEach( k => Console.WriteLine( nvc[k] ) );
}
return true;
},
new NameValueCollection() { { "param1", "hithere!" } } );