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

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 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?