【问题标题】:How can I prevent "consider applying 'await' operator..." warning for certain functions?如何防止“考虑应用'await'运算符...”某些功能的警告?
【发布时间】:2018-08-27 08:30:02
【问题描述】:

如果我有一个可以等待但通常不是等待的方法,我该如何防止该方法出现警告?在每个呼叫站点附加#pragmas 来抑制更令人眼花缭乱,我不想全局禁用警告,因为确实应该等待许多Task 返回函数;这只是我想说的一个小子集“即使它可以,这个函数也不希望是awaited,所以如果在没有await的情况下调用它,请不要发出警告”。

【问题讨论】:

  • @Stefan 我特地问如何修改 called 方法来抑制警告;不是 调用 方法。
  • 是否需要由呼叫者来确定是否需要等待呼叫?
  • 被调用者知道在没有await 的情况下运行其操作的内容是否有意义。不管怎样,我并没有要求代码审查,而是要求某个操作是否可行。我认为没有,如果您有可靠的来源以这种方式回答这个问题,我们将不胜感激。也就是说,说“你想做的事情是错误的,所以你能不能做到”是很不礼貌的。

标签: c# async-await


【解决方案1】:

您似乎想解雇某些任务。

我写了一个扩展方法,比如:

public static class TaskExtensions
{
  public void FireAndForget(this Task task)
  {
    // access exception (and ideally log it) to avoid a potential exception being rethrown by the finalizer as an unobserved exception
    task.ContinueWith(t => Debug.WriteLine(t.Exception), TaskContinuationOptions.OnlyOnFaulted);
  }
}

现在您可以通过

将任务标记为即发即弃
task.FireAndForget();

并且编译器不会抱怨,因为任务没有被等待,并且不会出现看似不知从何而来的 UnobservedTaskException,因为只要 GC 的终结器线程决定释放任务,它们就会被重新抛出,使它们看起来有些不稳定。

【讨论】:

  • @Stefan 你是对的。之前没有查看您的链接,这有点尴尬和尴尬。我应该删除我的答案以避免重复吗?
  • 不确定...如果您收到很多反对票,您就会知道 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
相关资源
最近更新 更多