在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
相关产品推荐
相关产品推荐

