Func <t1,tresult =“”> TResult包含在Task中

时间:2016-05-23 15:55:37

标签: c# .net asynchronous task

public Task<Tresult> WrapIntoTask<Tresult>(Func<Tresult> function) 
where Tresult : class
{
    return Task.Run(function);
}
public Task<Tresult> WrapIntoTask<T, Tresult>(Func<T, Tresult> function) 
where Tresult : class where T : class
{
     return Task.Run(function); // Cannot pass in Func<T1, Tresult>
}

第一种方法符合要求并且工作正常,而第二种方法不允许编译。

如何将实际T值传入Task

1 个答案:

答案 0 :(得分:2)

由于您需要将不带任何其他参数的委托传递给Task.Run,因此您需要通过传递类型为T的参数将参数获取委托包装到无参数委托中。< / p>

return Task.Run(() => function(default(T)));
//                             ^^^^^^^^^^
//                            Replace this

当然,您需要将T类型的实例传递给function来代替default(T)。例如,您可以将Tfunction一起传递,如下所示:

public Task<Tresult> WrapIntoTask<T, Tresult>(Func<T, Tresult> function, T arg) 
where Tresult : class where T : class
{
     return Task.Run(() => function(arg));
}