Task.Run и Func <>

Как запустить задачу, возвращающую значение и принимающую параметр? Я вижу, что существует перегруженный метод Task.Run<TResult>(Func<TResult>), но как я могу передать там параметр?

Ответ 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!" } } );