【问题标题】:Anonymous methods - 3 different ways - async匿名方法 - 3 种不同的方式 - 异步
【发布时间】:2020-03-02 11:33:17
【问题描述】:

不确定在标题中写什么,它们可能不都是匿名方法,但这里是:

假设我们有这个异步函数:

public async Task Delete(){  
  //something
}

我正在使用 Blazor 服务器端,我对以下四种调用函数的方式感到好奇。假设它们在 div 标签内。

  1. onclick="@Delete"

  2. onclick="@(() => Delete(id))"

  3. onclick="@(async () => await Delete(id))"

  4. onclick="@(e => Delete(person.Id))

我不确定 1 是否是 Blazor 的新手,但它是否理解该方法是异步的?

如果需要传入参数,将使用 2 和 3,但我之前从未使用过异步部分,仅在较旧的帖子中看到。还需要说"async () =>"吗?

【问题讨论】:

  • 至 3:使用await 调用某些东西假定您的方法是async。所以是的,你在使用另一个时需要一个。
  • 好收获。使伪代码有点太快了

标签: c# asp.net-core methods anonymous-function blazor


【解决方案1】:

在 Blazor 的早期版本中,您需要使用选项 3,因为不支持 async 函数。如果您错过了 await,则 Blazor 无法知道该方法已完成,因此您需要手动调用 StateHasChanged,以便在需要时重新渲染组件。

但是,现在 Blazor 确实支持异步方法,因此您可以坚持使用选项 1,但需要注意的是您需要该方法返回 Task 而不是 void

所以你需要这样的东西:

public async Task Delete(){  
  //something
}

在 Blazor 中:

onclick="@Delete"

【讨论】:

  • 谢谢。 (oof, cmets 不喜欢换行) 当需要传入参数时,你会推荐 2/3 还是 4 的哪个版本?关于4,是否需要在“e”之前“async”或“Delete”之前的“await”或?感觉就像我在这里混合了不同的概念。如果您有时间,我很想听听/确认 1、2/3 和 4 的概念/上下文是什么。我对它的理解: 1:?? 2:非异步匿名方法 3:异步匿名方法 4:lambda 表达式 - 更好/更差/为什么?
  • 对于参数,只需像使用任何方法一样传递它们@Delete(value1, value2)
  • 这实际上对我不起作用。我有这个:@{ string textParam="Texty";} 该方法如下所示:“private async Task ChangeLang(string incParam )" 我收到编译器错误:"参数 2:无法从 'System.Threading.Tasks.Task' 转换为 'Microsoft.AspNetCore.Components.EventCallback'"
  • 看看thisEventCallback 代表。抱歉,我现在不在与 Blazor 兼容的 IDE 附近进行检查
  • @Track,我也遇到了这个参数问题。在这种情况下,选项 2 和 3(用于异步)似乎是要走的路。希望你的背部没有皮肤。
猜你喜欢
  • 2018-03-03
  • 2010-12-29
  • 2015-08-19
  • 2015-03-30
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多