在做一个同步数据库问题,需要从数据库中取用户信息提交到公司的云端,用的
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)
HttpClient PostAsync 多次,导致线程池不够
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 茂大叔 2019-06-08 12:37关注
这个是你的设计方案的架构性问题,如果无限制的使用PostAsync,理论上都会有资源耗尽的风险,最极端的情况是超大并发导致对方网络设备判定为攻击,从而拒绝你的连接。
因此,在服务器端做远程交互时,不应该并行调用PostAsync,而应该依据需要逐个线性调用。
建议在本地新建一个表作为需要远程提交的记录的队列,每次需要远程调用时,就把相关记录存入这张表。然后再启用一个线程专门轮询该表,逐个的把相关记录提交到远端,并根据提交情况对这个队列表进行维护,也就是说如果提交成功就删除这条记录,没有的话就把记录挪到最后,以便下次再试。
这样,你对远端服务器的访问就是可控而安全的,也不会影响你本地的业务。好的架构设计对软件品质的影响非常重要,可以避免90%以上的BUG
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报