Отказаться от реализации с CancellationTokenSource на стороне сервера Blazor - PullRequest
1 голос
/ 26 октября 2019

Я реализовал отладку при вводе с помощью CancellationTokenSource в приложении на стороне сервера Blazor (.net core 3.0).

Он хорошо работает с задержкой ввода, как и ожидалось, но всегда выдает ошибки в выводе отладки при вводе:

Exception thrown: 'System.InvalidOperationException' in Microsoft.AspNetCore.Components.dll

и при быстром наборе:

Exception thrown: 'System.Threading.Tasks.TaskCanceledException' in System.Private.CoreLib.dll

У вас есть идеи, как это исправить?

Вы можете найти реализацию здесь: https://blazorfiddle.com/s/ij9l55ne

Главная страница:

@page "/"
@using System.Threading
@using System.Threading.Tasks

<MyChildComponent OnTyping="async e => await OnTypingAsync(e)"/>
<div>@result</div>

@code {
    string result;

    public async Task OnTypingAsync(string myText)
    {
        await Task.Delay(1);//call GetDataAsync(myText) method

        result = myText;
        await InvokeAsync(StateHasChanged);
    }
}

Дочерний компонент:

@using System.Threading
@using System.Threading.Tasks

<input type="text" @oninput="async e => await OnInput(e)" />

@code {
    [Parameter] public EventCallback<string> OnTyping { get; set; }

    CancellationTokenSource Cts = new CancellationTokenSource();
    CancellationToken Ct;

    public async Task OnInput(ChangeEventArgs e)
    {
        Cts.Cancel();
        Cts = new CancellationTokenSource();
        Ct = Cts.Token;

        await Task.Delay(500, Ct).ContinueWith(async task =>
        {
            if (!task.IsCanceled) {
                await OnTyping.InvokeAsync(e.Value.ToString());
            }
        }, Ct);
    }
}
...