[英]MaxDegreeOfParallelism with Task.Factory.StartNew()
[英]Task.Factory.StartNew() overloads
我有非常简单的代码:
static void Main(string[] args)
{
var task = Task.Factory.StartNew(GetInt);
var task2 = Task.Factory.StartNew(
() =>
{
return GetInt();
});
}
static int GetInt()
{
return 64;
}
为什么第一个任务会出现编译器错误? 方法签名(无参数,返回类型为int
)是相等的,不是吗?
我知道一个解决方案(这很简单: var task = Task.Factory.StartNew<int>(GetInt);
)但我想知道上面的代码有什么问题。
因为编译器无法决定使用这两个重载中的哪一个:
StartNew(Action)
StartNew<TResult>(Func<TResult>)
这样做的原因是返回类型不是 C# 中重载决议的一部分(就像你不能有两个重载只是返回类型不同一样)因此编译器无法决定GetInt
应该是Action
还是Func<T>
。 通过调用StartNew<int>(GetInt)
强制使用通用版本将提供所需的信息。
作为记录,这里有另外两种方法(即编译):
var task3 = Task.Factory.StartNew((Func<int>)GetInt);
var task4 = Task.Factory.StartNew(() => GetInt());
有助于显示异常: “以下方法或属性之间的调用不明确:‘System.Threading.Tasks.TaskFactory.StartNew(System.Action)’和‘System.Threading.Tasks.TaskFactory.StartNew(System.Func) )'"
如果您看一下,有两种可能的方法:
public Task<TResult> StartNew<TResult>(Func<TResult> function);
public Task StartNew(Action action);
如果您添加<int>
或提供Func<int>
,您将强制它采用第一个签名。 否则你的代码是模棱两可的。
您会收到编译错误,因为 StartNew 方法采用 Action(返回 void)或 Func(返回某些东西)谓词及其各种重载,而不是直接委托。
正如其他人所述,您需要将 GetInt 作为 function 传递给 StartNew,或者指定您打算通过提供泛型类型从 StartNew 返回一个值。 否则,编译器不知道你打算创建什么样的任务......这是模棱两可的。
static void Main(string[] args)
{
var task = Task.Factory.StartNew<int>(GetInt);
var task2 = Task.Factory.StartNew(
() =>
{
return GetInt();
});
}
static int GetInt()
{
return 64;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.