我在 .NET 4.5 中看到Task.Run()
相当于
Task.Factory.StartNew(someAction,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
但在.NET 4.0中,TaskCreationOptions.DenyChildAttach
不存在。这是哪里吗TaskEx.Run
进来?评论中这个问题 https://stackoverflow.com/questions/6123630/task-factory-startnew-vs-taskex-run似乎表明了这一点,但没有给出详细说明。 .NET 4.0 中 .NET 4.5 的等效项是什么Task.Run
?
The DenyChildAttach
选项不仅不存在于TaskCreationOptions
枚举,它不存在于框架本身中。实际上会的代码拒绝尝试附加子任务.Net 4.0 中不存在。 (更多内容在New TaskCreationOptions and TaskContinuationOptions在.NET 4.5中 https://devblogs.microsoft.com/pfxteam/new-taskcreationoptions-and-taskcontinuationoptions-in-net-4-5/).
So the exact相当于Task.Run
.Net 4.0 中不存在也不可能存在。最接近的事情就是不使用AttachedToParent
该枚举中的值:
public static Task<TResult> Run<TResult>(Func<TResult> function)
{
return Task.Factory.StartNew(
function,
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default);
}
IMO 更重要的区别是支持async
代表们在Task.Run
。如果您通过了async
代表(即Func<Task<TResult>>
) to Factory.StartNew
你会得到回报Task<Task<TResult>>
代替Task<TResult>
正如一些人所期望的那样许多头痛的根源 https://stackoverflow.com/a/23929194/885318。解决方案是使用TaskExtensions.Unwrap
扩展方法“创建代理Task
代表一个异步操作Task<Task<T>>
":
public static Task<TResult> Run<TResult>(Func<Task<TResult>> function)
{
return Task.Factory.StartNew(
function,
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default).Unwrap();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)