該簽名允許您在運行Task.Run
時提供返回任務的方法。這是因爲Func<T>
的最後一個通用參數是您提供的代表給出的返回值。含義:
public Func<bool> IsValid = this.ValidateUser;
public bool ValidateUser() { return someUser.IsAuthenticated; }
甚至只是
public Func<bool> IsValidUser = this.User.IsAuthenticated;
然後你可以使用委託,就像任何其他的方法,並委託將返回一個bool。
public void Foo()
{
if (!IsValidUser()) throw new InvalidOperationException("Invalid user");
}
通過提供除返回值之外的其他泛型類型,您可以使用傳遞給委託的參數。
Func<int, bool> IsUserAgeValid = (age) => return age > 18;
// Invoke the age check
bool result = this.IsUserAgeValid(17);
需要記住的是最後一個泛型總是Func中的返回類型。如果只提供了一個通用類型,那麼沒有參數,只有返回類型。
A Func<Task>
允許您在您的Task.Run
調用中使用awaitable
方法。 這也意味着您可以在您提供的匿名代理內部await
。
public Task Foo()
{
/* .. do stuff */
}
public void Bar()
{
Task.Run(async() =>
{
await Foo();
/* do additional work */
});
}
,如果你不需要等待調用Foo()
,你可以給Task.Run
的Foo
方法。
Task.Run(Foo);
如果你發現自己想等待如上圖所示給Task.Run
的awaitable方法,它可能是更好您使用ContinueWith
。
public void Bar()
{
Task.Run(Foo).ContinueWith(foosTaskResult =>
{
/* Do stuff */
});
}
MSDN文檔說的任務返回的是對的˚F的任務代理,基本上意味着
Task returnedTask = Task.Run(Foo);
將設置returnedTask
到是由返回的任務調用等待方法Foo()
。