在 html 属性中调用 blazor 中的异步方法

Posted

技术标签:

【中文标题】在 html 属性中调用 blazor 中的异步方法【英文标题】:Call async method in blazor in html attribute 【发布时间】:2021-03-24 01:38:24 【问题描述】:

我正在尝试调用异步函数以从输入中检索数据并将其传递给元素的srcstyle 属性,具体取决于它是什么。但是,当我尝试等待它时,出现以下错误:

“await”运算符只能在异步方法中使用。考虑使用 'async' 修饰符标记此方法并将其返回类型更改为 'Task'

  <div class="swiper-slide" style="
        background-image: url(@await LinkConverter.GetLinkFromData(media)">
  </div>

但是当我尝试使用 lambda 表达式时:

  <div class="swiper-slide">
         <video src="@async () => await LinkConverter.GetLinkFromData(media, true)"  >
         </video>
  </div>

我收到以下错误(我不明白):

无法将 lambda 表达式转换为类型“对象”,因为它不是委托类型

该函数位于 foreach 和一些 if 语句中,因此我宁愿不必在OnIntializedAsync 创建结果列表并最终复制我的代码。

【问题讨论】:

【参考方案1】:

我建议为此使用组件。

你的 foreach 可能是这样的

@foreach(var media in MediaItems)

  <DisplayMedia @key=media FetchMediaTask=@(()=>LinkConverter.GetLinkFromData(media)) />

DisplayMedia 会是

@typeparam T
<div class="swiper-slide" style="
      background-image: url(@Data)">
</div>
@code

 [Parameter] public Func<Task<T>> FetchMediaTask  get; set; 
 T Data;
 protected override async Task OnAfterRenderAsync(bool first)
 
  if (first)
  
   Data = (T)await FetchMediaTask();
   StateHasChanged();
  
 

这样就可以在Component内部渲染divs,等待GetLinkFromData,支持。

演示:https://blazorrepl.com/repl/GEbcFnEm587VpE6g22

【讨论】:

以上是关于在 html 属性中调用 blazor 中的异步方法的主要内容,如果未能解决你的问题,请参考以下文章

同步异步阻塞非阻塞的概念理解

同步与异步,阻塞与非阻塞

Java并发概念-1

Python 中的协程 无阻塞

阻塞非阻塞,同步异步总结

同步调用,异步回调和 Future 模式