C#中调用第三方API的线程出现异常时如何重试或重启
解决方案
核心实现思路
不需要手动重启线程,仅需在工作线程的逻辑内部加入异常捕获+重试机制即可,同时控制最大重试次数、重试间隔,避免无限重试或请求过于频繁。
具体实现步骤
- 第一步:将平仓操作的核心逻辑封装为独立方法
- 第二步:在工作线程的入口逻辑外层增加循环,捕获
WebTimeout等可重试异常 - 第三步:配置合理的最大重试次数、重试间隔,避免无限制重试导致资源占用
- 第四步:如果所有重试都失败,可根据业务需求记录错误日志、触发业务告警
代码示例
using System; using System.Threading; // 平仓操作封装类 public class PositionCloser { // 最大重试次数,可根据业务需求调整 private const int MaxRetryCount = 3; // 重试间隔(毫秒),避免短时间重复请求触发第三方限流 private const int RetryIntervalMs = 2000; public void StartClosePositionThread(long orderId) { // 按需启动工作线程,不会阻塞主线程 var workThread = new Thread(() => RunClosePositionLogic(orderId)); workThread.IsBackground = true; workThread.Start(); } private void RunClosePositionLogic(long orderId) { int retryCount = 0; bool success = false; while (retryCount < MaxRetryCount && !success) { try { // 调用第三方API执行平仓操作 ThirdPartyApi.ClosePosition(orderId); success = true; // 操作成功可自行添加日志记录逻辑 Console.WriteLine($"订单{orderId}平仓成功"); } catch (WebTimeoutException ex) // 捕获可重试的超时异常 { retryCount++; Console.WriteLine($"订单{orderId}平仓第{retryCount}次失败,超时异常:{ex.Message}"); if (retryCount >= MaxRetryCount) { // 重试全部失败,记录严重错误,可自行对接业务告警逻辑 Console.WriteLine($"订单{orderId}平仓累计失败{MaxRetryCount}次,终止重试"); break; } // 等待指定时间后再重试 Thread.Sleep(RetryIntervalMs); } catch (Exception ex) // 其他不可重试异常直接处理 { Console.WriteLine($"订单{orderId}平仓遇到不可重试异常:{ex.Message}"); break; } } } } // 模拟第三方API类 public static class ThirdPartyApi { public static void ClosePosition(long orderId) { // 第三方API实际调用逻辑 } }
注意事项
- 建议将线程的
IsBackground属性设为true,避免线程异常卡住导致程序无法正常退出 - 重试间隔可采用指数退避策略,比如第一次等待2秒、第二次等待4秒、第三次等待8秒,进一步降低第三方接口压力
- 所有重试失败的场景必须留存日志记录,方便后续排查业务问题
- 如果项目支持异步语法,更推荐用
Task代替原生Thread,资源占用更低,也可直接用成熟的重试类库简化实现,若只能用原生Thread直接使用上述方案即可
内容的提问来源于stack exchange,提问作者Abhishek Dhar
相关产品推荐
相关产品推荐

