返回类型错误的Blazor任务

时间:2019-09-18 11:10:56

标签: c# task return-type blazor

我遇到了错误

  

任务>   __generation__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;
        }
    }

}

3 个答案:

答案 0 :(得分:2)

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

    <section id="page_network">
        <body>

            <div id="menu">
                <ul>
                    <li><a href="#page_login">LOGIN</a></li>
                    <li><a href="#page_network">NETWORK</a></li>
                    <li><a href="#page_parameters">PARAMETERS</a></li>
                </ul>
            </div>

            <br><br>
            <h2> >>> NETWORK <<< </h2>

            <!-- MCU START -->
            <h3>STATUS: "DISCONNECTED / CONNECTED TO NETWORK x WITH IP y"</h3>

            <form id="select_network" action="select_network" method="post">

                <label>SELECT WIFI NETWORK:</label>

                <select name="SSID">
                    <option>network1</option>
                    <option>network2</option>
                    <option>network3</option>
                    <option>network4</option>
                    <option>networkN</option>
                </select><br>
            <!-- MCU END -->

                <label>PASSWORD:</label>
                <input type="password" name="pass" id="pass" value="">
                <br>


                <input type="button" onclick="functionCheckNetworkPassword()" value="CONNECT" id="btn1">

            </form>

            <!-- MCU (END CAN BE HERE ALSO) -->

        </body>
    </section>

答案 1 :(得分:1)

我通过将SearchFilms方法更改为以下方法来解决此问题,很奇怪。

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

答案 2 :(得分:1)

简介

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<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's answer

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