Task.Run和Func<>是什么?

15
我该如何运行一个带有参数并返回值的任务?我看到有一个重载方法Task.Run<TResult>(Func<TResult>),但是如何将参数传递进去呢?
2个回答

29

Func<TResult>不接受参数。通常情况下,您可以使用lambda表达式来捕获参数。例如:

注:本翻译保留了原文中的HTML标签

public void DoSomething(string text)
{
    Task<int> task = Task.Run(() => text.Length);
    ...
}

在这里,text是一个捕获变量...所以即使您只是创建一个Func<int>,它也会使用方法参数。


@BVernon:假设您以后不会更改“text”的值,我认为它看起来很好。 - Jon Skeet
我觉得我只是忘记了一些非常基础的东西...如果我使用不同的文本值多次调用DoSomething,那么每个调用都会在内存中有每个版本的副本,对吗? - BVernon
这个 lambda 函数不可能使用在另一个 DoSomething 调用中传入的 text 值,对吗? - BVernon
@BVernon:每次调用都会创建一个编译器生成的类的不同实例。因此,调用之间不会看到彼此的“text”值。 - Jon Skeet

7
您可以使用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!" } } );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接