wzmlove007 2019-06-08 11:28 采纳率: 100%
浏览 3324
已采纳

HttpClient PostAsync 多次,导致线程池不够

在做一个同步数据库问题,需要从数据库中取用户信息提交到公司的云端,用的
HttpClient PostAsync,将本地的用户信息更新到云端。
现在遇到一个问题是,由于需要做为实时更新的功能,所以在增加,修改和删除
用户的时候都post一下,导致会循环调用postAsync。
报这么一个错:
System.AggregateException: One or more errors occurred. ---> System.InvalidOperationException: There were not enough free threads in the ThreadPool to complete the operation.
at System.Net.HttpWebRequest.BeginGetRequestStream(AsyncCallback callback, Object state)
at System.Net.Http.HttpClientHandler.StartGettingRequestStream(RequestState state)
at System.Net.Http.HttpClientHandler.PrepareAndStartContentUpload(RequestState state)
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task`1.get_Result()
at Kingdee.KIS.JGJMobWeb.UserSync.Services.UploadService.Upload2KisCloud(String bodyContent)
---> (Inner Exception #0) System.InvalidOperationException: There were not enough free threads in the ThreadPool to complete the operation.
at System.Net.HttpWebRequest.BeginGetRequestStream(AsyncCallback callback, Object state)
at System.Net.Http.HttpClientHandler.StartGettingRequestStream(RequestState state)
at System.Net.Http.HttpClientHandler.PrepareAndStartContentUpload(RequestState state)

  • 写回答

2条回答 默认 最新

  • 茂大叔 2019-06-08 12:37
    关注

    这个是你的设计方案的架构性问题,如果无限制的使用PostAsync,理论上都会有资源耗尽的风险,最极端的情况是超大并发导致对方网络设备判定为攻击,从而拒绝你的连接。
    因此,在服务器端做远程交互时,不应该并行调用PostAsync,而应该依据需要逐个线性调用。
    建议在本地新建一个表作为需要远程提交的记录的队列,每次需要远程调用时,就把相关记录存入这张表。然后再启用一个线程专门轮询该表,逐个的把相关记录提交到远端,并根据提交情况对这个队列表进行维护,也就是说如果提交成功就删除这条记录,没有的话就把记录挪到最后,以便下次再试。
    这样,你对远端服务器的访问就是可控而安全的,也不会影响你本地的业务。

    好的架构设计对软件品质的影响非常重要,可以避免90%以上的BUG

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器