Partager via


Avertissement du compilateur WFO2001

Version présentée : .NET 9

La tâche est passée à InvokeAsync sans jeton d’annulation

Fournissez un jeton d'annulation lors du renvoi d'un Task ou d'un ValueTask depuis un InvokeAsync, ce qui garantit que le délégué peut être correctement attendu et que les exceptions peuvent être gérées.

Vous pouvez ignorer cette erreur si votre intention est d’exécuter une tâche non supervisée.

Pour corriger cet avertissement

Utilisez des fonctions qui acceptent des jetons d’annulation en tant qu’argument. Cela permet au délégué passé à InvokeAsync d'être mis en attente, en s'assurant que les exceptions sont gérées correctement.

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

Gérer l’avertissement

Supprimez l’avertissement avec l’une des méthodes suivantes :

  • Définissez la gravité de la règle dans le fichier .editorConfig .

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

    Pour plus d’informations sur les fichiers de configuration de l’éditeur, consultez Les fichiers de configuration pour les règles d’analyse du code.

  • Ajoutez les PropertyGroup suivantes à votre fichier projet :

    <PropertyGroup>
        <NoWarn>$(NoWarn);WFO2001</NoWarn>
    </PropertyGroup>
    
  • Effectuez la suppression dans le code avec la directive #pragma warning disable WFO2001.