【问题标题】:Blazor Task With Wrong Return Type返回类型错误的 Blazor 任务
【发布时间】:2020-01-19 07:56:39
【问题描述】:

我收到了错误

任务> __generated__Index.SearchFilms(string)' 返回类型错误

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

 <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;
        }
    }

}

【问题讨论】:

    标签: c# task return-type blazor


    【解决方案1】:

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

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

    【讨论】:

    • Alec,它运行但你不知道方法。我在my answer 上解释过
    【解决方案2】:

    简介

    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 操作。

    另外,quoting docs:

    您必须向 SearchMethod 参数提供具有以下签名 Task&lt;IEnumerable&lt;T&gt; 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's answer

    (*1) 你也可以避免在方法上方写#pragma warning disable CS1998的警告(感谢@Henk Holterman

    【讨论】:

    • dani,你永远不应该等待 Task.CompletedTask;阅读:tugberkugurlu.com/archive/…
    • 这看起来和问题中的代码完全一样,我没有看到解释部分。 @Alec:这是否使用 List&lt;Film&gt; 而不是 IEnumerable&lt;Film&gt; 运行?
    • @Issac,确切地说,永远不会进入异步方法。
    • 您可以删除(省略) async&await 关键字,请参阅@agua 的 anwser。
    • @HenkHolterman,OMG:您必须向 SearchMethod 参数提供具有以下签名 Task MethodName(string searchText) 的方法。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 2021-03-16
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      相关资源
      最近更新 更多