Compartilhar via


Aviso do compilador WFO2001

Versão introduzida: .NET 9

A tarefa está sendo passada para InvokeAsync sem um token de cancelamento

Forneça um token de cancelamento ao retornar um Task ou ValueTask de InvokeAsync, o que garante que o delegado possa ser aguardado corretamente e as exceções possam ser tratadas.

Você poderá ignorar esse erro se sua intenção for executar uma tarefa não supervisionada.

Para corrigir este aviso

Utilize funções que recebem tokens de cancelamento como argumento. Isso permitirá que o delegado transmitido para InvokeAsync seja aguardado, garantindo que as exceções sejam tratadas corretamente.

CancellationTokenSource _stopWatchTokenSource = new();
CancellationToken _stopWatchToken;

private async void btnStopWatch_Click(object sender, EventArgs e)
{
    if (_stopWatchToken.CanBeCanceled)
    {
        btnStopWatch.Text = "Start";
        _stopWatchTokenSource.Cancel();
        _stopWatchTokenSource.Dispose();
        _stopWatchTokenSource = new CancellationTokenSource();
        _stopWatchToken = CancellationToken.None;

        return;
    }

    _stopWatchToken = _stopWatchTokenSource.Token;
    btnStopWatch.Text = "Stop";

    await Task.Run(async () =>
    {
        while (true)
        {
            try
            {
                await this.InvokeAsync(UpdateUiAsync, _stopWatchToken);
            }
            catch (TaskCanceledException)
            {
                break;
            }
        }
    });
}

// The actual UI update method
async ValueTask UpdateUiAsync(CancellationToken cancellation)
{
    lblStopWatch.Text = $"{DateTime.Now:HH:mm:ss - fff}";
    await Task.Delay(20, cancellation);
}

// Make sure that the token is cancelled when the form is closed
protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing(e);
    _stopWatchTokenSource.Cancel();
}

Gerenciar o aviso

Suprime o aviso com qualquer um dos seguintes métodos:

  • Defina a gravidade da regra no arquivo .editorConfig .

    [*.{cs,vb}]
    dotnet_diagnostic.WFO2001.severity = none
    

    Para obter mais informações sobre arquivos de configuração do editor, consulte Arquivos de configuração para regras de análise de código.

  • Adicione o seguinte PropertyGroup ao arquivo de projeto:

    <PropertyGroup>
        <NoWarn>$(NoWarn);WFO2001</NoWarn>
    </PropertyGroup>
    
  • Suprimir no código com a diretiva #pragma warning disable WFO2001.