You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中等待Twilio通话结束并获取通话状态

解决Twilio通话状态获取问题

首先,你用wait()导致卡顿是因为它会阻塞当前线程,正确的异步调用应该用await,但要注意:await CallResource.CreateAsync(...)只是等待通话发起完成,并不是等待通话结束,此时拿到的通话状态大概率是queued或ringing,不是最终状态。

要获取通话结束后的最终状态,有两种可靠方案:

方案一:使用Twilio状态回调(推荐)

在创建通话时指定statusCallback参数,Twilio会在通话状态变化(比如接通、结束、失败)时,向你提供的URL发送POST请求,请求体里包含CallStatus字段(最终状态可能是completed/failed/canceled等)。

修改后的代码示例:

var call = await CallResource.CreateAsync(
    url: new Uri("http://demo.twilio.com/docs/voice.xml"),
    to: new Twilio.Types.PhoneNumber("XXXX"),
    from: new Twilio.Types.PhoneNumber("XXXX"),
    statusCallback: new Uri("https://your-server.com/twilio-status"), // 你的回调接口地址
    statusCallbackMethod: Twilio.Http.HttpMethod.Post,
    statusCallbackEvent: new List<string> { "completed", "failed", "canceled" } // 指定需要通知的状态事件
);

你需要在自己的服务器上实现https://your-server.com/twilio-status接口,接收Twilio的POST请求,从中提取CallStatus和CallSid来记录最终状态。

方案二:轮询通话状态(适合无服务器场景)

如果无法搭建回调接口,可以定期查询通话状态,直到状态变为最终状态。注意要设置合理的查询间隔,避免频繁请求Twilio API:

// 先发起通话
var call = await CallResource.CreateAsync(
    url: new Uri("http://demo.twilio.com/docs/voice.xml"),
    to: new Twilio.Types.PhoneNumber("XXXX"),
    from: new Twilio.Types.PhoneNumber("XXXX")
);

// 定义最终状态集合
var finalStatuses = new HashSet<string> { "completed", "failed", "canceled", "busy", "no-answer" };
string currentStatus = call.Status.ToString();

// 轮询直到获取最终状态
while (!finalStatuses.Contains(currentStatus))
{
    // 等待5秒再查询,可根据需求调整
    await Task.Delay(5000);
    var updatedCall = await CallResource.FetchAsync(call.Sid);
    currentStatus = updatedCall.Status.ToString();
}

// 此时currentStatus就是最终通话状态
Console.WriteLine($"最终通话状态:{currentStatus}");

关键注意点

  • 永远用await替代wait(),避免线程阻塞导致程序卡顿。
  • 状态回调是Twilio官方推荐的方式,效率更高,无需主动轮询。
  • 轮询时不要设置过短的间隔,否则可能触发Twilio API的速率限制。

内容的提问来源于stack exchange,提问作者B D Electrocom Pvt Ltd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:33:20