【问题标题】:Force Await On Function Call强制等待函数调用
【发布时间】:2018-12-14 22:04:10
【问题描述】:

如果旁边没有 await 关键字,是否可以创建一个会抛出错误的函数? 我没有用它来做任何事情,我只是好奇,我想我可以看到,如果处理的数据极大地影响程序的运行,它可能会有它的用途。

【问题讨论】:

  • 不确定是否可以强制,您可以将“4014”添加到项目属性中的“将警告视为错误”列表中。
  • 如果你的来电者想elide async and await怎么办?这是一个非常糟糕的主意,不要对你的来电者做出假设。
  • 也许你应该放一些代码? -.- 您至少尝试过一次还是在等待现成的解决方案?
  • 从我在网上可以找到的最接近的事情是检测是否已等待任务。显然,如果你检测到它,你可以创建并抛出你自己的异常,但问题是你只能在它已经完成异步操作后检测到它。我想知道您是否可以阻止调用(出现编译器错误)或提前抛出异常。

标签: c# asynchronous async-await


【解决方案1】:

不一定有一个好方法可以做到这一点。将警告代码提升为错误是一种选择。但是,如果您只关心返回结果的async 函数,即Task<T>,那么就有可能进行编译时检查。

例如:

public class ForceAwait
{
    public Task<int> MethodAsync() => Task.FromResult(1);

    public Task Caller_Does_Not_Compile()
    {
        int result = MethodAsync();
        return Task.CompletedTask;
    }

    public async Task Caller_Compiles()
    {
        int result = await MethodAsync();
    }
}

通过将结果显式键入T 而不是使用var,如果您尝试将Task&lt;T&gt; 分配给T 类型的变量,编译器会报错。当然,这只是一个技巧/hack,不适用于返回 Task 的方法。

【讨论】:

    【解决方案2】:

    同意 DavidG。尝试将编译器警告级别设置为 4 并为您的项目启用“将警告视为错误”。为 Debug、Release 和所有配置执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      相关资源
      最近更新 更多