【发布时间】:2020-01-31 13:45:16
【问题描述】:
我在 ASP.NET Core Blazor 上进行开发,有时我会在 GitHub 上学习一些东西。这个问题与 Blazor 没有严格的关系,但我看到很多 Blazor 开发人员在做我将要解释的事情。
我注意到一些组件接受Action<T> 作为参数,而另一些则接受Func<T, Task>。
/* example */
public class MyComponentA : ComponentBase
{
[Parameter] public Action<T> OnClick {get; set;}
//... other methods
}
public class MyComponentB : ComponentBase
{
[Parameter] public Func<T, Task> OnClickAsync {get; set;}
//... other methods
}
我的理解是,您应该将 Action<T> 绑定到 no-async/await 方法,将 Func<T, Task> 绑定到 async/method。到目前为止一切顺利。
但是,我看到有人习惯于将 async/await 匿名函数 传递为 Action<T>,例如 OnClick=@(async (item) => await Foo(item))。有时,我也将匿名 async/await 函数作为 Action 传递,并且它可以工作。
正确吗?
有什么副作用吗?
调用匿名 async/await 函数的
Action<T>是异步调用吗?
【问题讨论】:
-
Action是一个没有返回值的委托;Func是一个有返回值的委托。您使用哪一个与特定方法是否异步执行无关。 -
@stackoverflow.com/users/884561/kenneth-k 那么为什么有些开发人员会说“现在,使用 Func
我们的组件接受异步方法。UI 线程不会被我们的组件阻塞”。按照您的回答,这句话似乎没有任何意义。似乎 Func 是一种更好的方式来接受 async/await 方法而不使用 async/await 匿名方法。
标签: c# async-await blazor