返回类型错误的 Blazor 任务



我收到错误

任务>__generated__Index.搜索电影(字符串(' 具有错误的返回类型

在我下面的代码上,我不知道为什么。有问题的行是

<BlazoredTypeahead SearchMethod="SearchFilms"

法典:

@page "/"
@using Blazored.Typeahead
<BlazoredTypeahead SearchMethod="SearchFilms"
@bind-Value="SelectedFilm">
<SelectedTemplate>
@context.Title
</SelectedTemplate>
<ResultTemplate>
@context.Title (@context.Year)
</ResultTemplate>
</BlazoredTypeahead>
@if (SelectedFilm != null)
{
<p>Selected Film is: @SelectedFilm.Title</p>
}

@code {
private List<Film> Films;
private Film SelectedFilm;
protected override void OnInitialized()
{
Films = new List<Film> {
new Film("The Matrix", 1999),
new Film("Hackers", 1995),
new Film("War Games", 1983) };
}
private async  Task<List<Film>> SearchFilms(string searchText)
{
return await Task.FromResult(Films.Where(x => x.Title.ToLower().Contains(searchText.ToLower())).ToList());
}
class Film
{
public string Title { get; set; }
public int Year { get; set; }
public Film(string title, int year)
{
Title = title;
Year = year;
}
}
}

简介

BlazoredTypeahead时,SearchMethod是异步的,因为此委托旨在调用后端以获取数据,并且我们无法阻止等待结果的 UI 线程。通常:

private async  Task<IEnumerable<Film>> SearchFilms(string searchText)
{
try
{
var result = await BackendService.SearchFilms(searchText);
return result;
} 
catch ( ... )
{
UiShowError( ... )
return empty_list;
}
}

但在您的情况下,不涉及后端操作,并且您的整个方法是同步的。然后,编译器将引发警告,因为它们不是方法中的任何async操作。

另外,引用文档:

必须向 SearchMethod 参数提供具有以下签名Task<IEnumerable<T> MethodName(string searchText)的方法。

溶液

一个简单且可读的解决方案是在方法中进行async调用:

private async  Task<IEnumerable<Film>> SearchFilms(string searchText)
{
var result = Films
.Where(x => x.Title.ToLower().Contains(searchText.ToLower()))
.ToList();
await Task.CompletedTask;  // avoid warning (*1)
return result;
}

但它们是其他更多方法:您可以进行微观优化并避免async并将result转换为task,请参阅aguas的答案。

(*1(您也可以避免在方法上方#pragma warning disable CS1998写警告(感谢@Henk霍尔特曼(

您没有在私有方法中使用异步方法。代码应为:

private Task<List<Film>> SearchFilms(string searchText)
{
return Task.FromResult(Films.Where(x => x.Title.ToLower().Contains(searchText.ToLower())).ToList());
}

我通过将SearchFilms方法更改为下面的方法来修复它,很奇怪。

private async Task<IEnumerable<Film>> SearchFilms(string searchText) 
{
return await Task.FromResult(Films.Where(x => x.Title.ToLower().Contains(searchText.ToLower())).ToList());
}

最新更新