编译器警告 WFO2001

引入的版本:.NET 9

Task 在没有取消令牌的情况下传递至 InvokeAsync

返回 Task 中的 ValueTaskInvokeAsync 时提供取消令牌,以确保可正确等待委托并且可处理异常。

如果打算运行未监督的任务,则可以忽略此错误。

更正此警告

使用将取消令牌作为参数的函数。 这将允许等待传递给 InvokeAsync 的委托,以确保正确处理异常。

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

管理警告

使用以下任一方法禁止显示警告:

  • .editorConfig 文件中设置规则的严重性。

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

    有关编辑器配置文件的详细信息,请参阅 用于代码分析规则的配置文件。

  • 将以下 PropertyGroup 添加到项目文件:

    <PropertyGroup>
        <NoWarn>$(NoWarn);WFO2001</NoWarn>
    </PropertyGroup>
    
  • 在代码中使用 #pragma warning disable WFO2001 指令进行抑制。