我收到错误
任务>__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());
}