【问题标题】:Problems Understanding Async Task C#理解异步任务 C# 的问题
【发布时间】:2021-10-05 22:20:21
【问题描述】:

大家好,提前感谢您的帮助。我正在使用 .Net Core C# 和 Twilio api。我在控制器上使用了一个 Twilio 示例,如下所示:

public async Task<TwiMLResult> InboundSMS(SmsRequest request, int numMedia)
    { return TwiML(messagingResponse); }

Intellisense 告诉我“异步方法缺少 await 运算符,将同步运行。考虑使用 await 运算符来等待非阻塞 api 调用。”控制器是由 Twilio api 调用的端点。端点依次处理发布的数据,然后执行各种业务逻辑例程。老实说,我真的不确定这告诉我什么,我不知道我应该如何(或什至)纠正这个问题。此外,由于该端点会产生多个业务逻辑例程,因此运行了这么长时间,我想了解我在做什么。任何帮助将不胜感激。

【问题讨论】:

  • 我不想听起来刺耳,但是如果你不理解那个错误信息,你需要花一两个小时理解async/await才能使用它,否则你会遇到更严重的问题与他们的滥用。即使是经验丰富的程序员也不总是正确地异步/等待。该消息告诉您return TwiML(messagingResponse) 的正确语法是return await TwiML(messagingResponse)。如果这给您一个关于 no GetAwaiter 的错误,那么 TwiML 方法不是异步的,您的 InboundSMS 方法也不应该是异步的。
  • 感谢您的回复。一点都不苛刻。我只需要确信知道错误消息返回 await TwiML(messagingResponse) 告诉我没有 GetAwaiter。错误的代码示例,但我应该知道得更好。再次感谢。
  • 第一条消息,缺少等待操作符,将同步运行实际上只是一个警告/提醒,您可能忘记了await 关键字。也就是说,如果TwiML 方法不是异步的,您可以放心地忽略警告并将async 关键字也留在那里。当使用异步方法与非异步方法混合使用时,这会令人困惑和草率,但有时是必要的。

标签: c# .net asp.net-core-mvc


【解决方案1】:

这两个正确答案是:

  1. 从方法中删除任务:

    public TwiMLResult InboundSMS(SmsRequest request, int numMedia) { return TwiML(messagingResponse); }

  2. 使用 AWAIT 使调用异步:

    public async Task&lt;TwiMLResult&gt; InboundSMS(SmsRequest request, int numMedia) { return await TwiML(messagingResponse); }

您选择哪种方法取决于“TwiML”是否真正异步

【讨论】:

  • 你错过了 3) Task.FromResult。有时你不得不实现一个需要任务的接口。
  • 同意,这是“一个”答案;但。我故意不建议使用 Task.FromResult,因为它通常是不好的做法,并且表明某些事情需要在某个地方重新考虑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多