【问题标题】:Task.Run and Func<>Task.Run 和 Func<>
【发布时间】:2012-10-29 19:25:21
【问题描述】:

如何运行返回值并接受参数的任务?我看到有一个重载方法Task.Run&lt;TResult&gt;(Func&lt;TResult&gt;),但是我如何在那里传递参数?

【问题讨论】:

    标签: c# windows-runtime .net-4.5


    【解决方案1】:

    Func&lt;TResult&gt; 不带参数。通常,您会捕获 使用 lambda 表达式代替的参数。例如:

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

    这里text 是一个捕获的变量...所以即使您只是创建一个Func&lt;int&gt;,它使用方法参数。

    【讨论】:

    • @BVernon:假设您稍后不更改text 的值,我觉得这很好。
    • 我想我只是忘记了一些非常基本的东西......如果我用不同的文本值多次调用 DoSomething,那么每次调用都会在内存中保存每个版本的副本,对吗?
    • 即lambda 不可能使用在对 DoSomething 的不同调用中发送的文本值?
    • @BVernon:每次调用都会创建一个编译器生成的类的不同实例。所以不,通话不会看到彼此的text 值。
    【解决方案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!" } } );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多