【问题标题】:Make Visual Studio warn missing await operator使 Visual Studio 警告缺少等待运算符
【发布时间】:2021-01-24 23:13:56
【问题描述】:

我在生产中遇到错误,因为从同步方法调用了一个异步方法。这在应用程序中产生了一种奇怪的行为。最后,我想通了,但我担心在代码中会像这样调用一些新的异步方法。

我想知道当我调用异步方法时是否有警告方法

public async Task TheMethodAsync()
{
   await Task.FromResult(0);
}

在同步方法中

public void OtherMethod()
{
    TheMethodAsync(); // <-- Warn this
}

顺便说一句:我们手动检查的方法太多了。

【问题讨论】:

  • warning CS4014,但它只出现在async方法中。
  • 在具有默认设置的 Visual Studio 2019 (16.7.2) 中,这种情况会为我生成 CS4014 警告。
  • 对此的警告已经存在了很长时间,至少 VS2013 是这样。确保不要忽略错误列表窗口中的警告。

标签: c# .net visual-studio .net-core async-await


【解决方案1】:

默认情况下,您会收到警告。不幸的是,有很多方法可以禁用警告,包括重新锐化选项

检查您的构建设置以及各种项目和重新调整选项,以确保有小手指脏的人没有抑制CS4014 变暖,同时检查任何编译指示禁用警告。

现在,如果你真的想把这个主页发给你的开发者伙伴,你可以在你的项目文件中使用WarningsAsErrors

例如

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <Nullable>enable</Nullable>
    <WarningsAsErrors>CS4014</WarningsAsErrors>
  </PropertyGroup>

这实际上会在CS4014 警告上创建一个编译器错误,进而导致构建失败。

注意:根据 警告 被抑制的方式,上述内容很有可能无效,您需要找出原因你一开始就没有收到警告

但是,如果一切正常,那么您将需要采取严厉措施明确删除编译器警告,迫使初级开发人员重新评估他们的位置生活中 在让async 方法运行之前未观察到

public static async Task Bob()
{
    await Task.Delay(1);
}

public static void Main(string[] args)
{
#pragma warning disable 4014
    Bob();
#pragma warning restore 4014
}

或者正如 kapsiR 的一个有价值的评论中提到的那样

你甚至可以使用一个技巧来摆脱以 C# 开头的警告 7 使用丢弃:_ = Bob();

虽然老实说,如果您对运行一劳永逸任务的人有问题,这可能会加剧问题。

【讨论】:

  • 除了你的答案:你甚至可以使用一个技巧来摆脱从 C# 7 开始使用 Discards 的警告:_ = Bob();
【解决方案2】:

修改代码

public void OtherMethod()
        {
            Task.Run( async  () =>  await TheMethodAsync()  );
        }

    }

【讨论】:

    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多