Delphi 10.3.1 TNetHttpClient在多线程中存在的问题及解决方法。
Delphi 10.3.1发布了,对10.3.0存在的各种问题,做了大量的修正。但听高勇说TNetHttpClient在多线程中存在问题,今天做了一下测试,确实如此,看来,还需要官方进一步修正!
具体测试方法,直接上代码:
procedure TForm1.Button3Click(Sender: TObject);
var
i: Integer;
begin
for i := to do // 大于2,无法测试通过.
begin
TThread.CreateAnonymousThread(
procedure()
var
aHttpClient: TNethttpClient;
AResponseContent: Tstream;
cnt: Integer;
ContentLength: Integer;
tid:Cardinal;
begin
cnt := ;
tid:=TThread.Current.ThreadID;
aHttpClient := TNethttpClient.Create(Self);//建立NetHttpClient实例,并用他不断的访问同一网址。
try
while true do
begin
Inc(cnt);
// aHttpClient := TNethttpClient.Create(Self);
AResponseContent := TMemoryStream.Create;
try
aHttpClient.Accept := 'text/javascript, text/html, application/xml, text/xml, /';
aHttpClient.AcceptLanguage := 'en-US,en;q=0.8,fr;q=0.6';
aHttpClient.UserAgent := 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36';
try
aHttpClient.Get('https://www.cnblogs.com/kinglandsoft/p/10383103.html',AResponseContent);//开始访问并返回结果到AResponseContent流中.
except
On E: Exception do
begin
TThread.Synchronize(nil,
procedure()
begin
if Memo1.Lines.Count > then
Memo1.Lines.Clear;
Memo1.Lines.Add(E.Message);
end);
end;
end;
ContentLength := AResponseContent.Size;//取得返回内容的长度,用来显示 TThread.Synchronize(nil,
procedure()
var
s: string;
begin
s := Format('cnt=%d,ContentLength:%d in thread id:%s',
[cnt, ContentLength, tid.ToString]);
Label1.Text := s;
Memo1.Lines.Add(s);
if Memo1.Lines.Count > then
Memo1.Lines.Clear;
end);
finally
// aHttpClient.Free;
AResponseContent.Free;
end;
end; // while true.
finally
aHttpClient.Free;
end;
end).Start;
end;
end;
实现思路,在线程中,建立一个NetHttpClient实例,用来访问一个网址,同时建立几个线程来运行NetHttpClient来访问。结果,如果实例数=2,可以通过,大于2,则无法通过。另外换成HttpClient也是同样的情况。此外,只是在android平台存在问题,win32平台正常。
向官方提交了这个问题,地址在https://quality.embarcadero.com/browse/RSP-23742,如果你也遇到,别忘记投一票,督促官方确认并修正。
跳过该问题的办法,在官方没有修正前,可以使用idHTTP来替代。
有解决方案了:
复制System.Net.HttpClient.pas单元到你的项目文件夹,修改THTTPClientExt的记录结构为如下代码:
THTTPClientExt = record
case Integer of
: (
FPreemptiveAuthentication: Boolean;
FSecureFailureReasons: THTTPSecureFailureReasons;
FAutomaticDecompression: THTTPCompressionMethods
);
: (
_pad: array[ .. ] of Byte
); end;
测试通过。
另外,如果不复制System.Net.HttpClient.pas到你的项目目录,则需要把System.Net.HttpClient.pas所在目录加入项目的Search Path中。
Delphi 10.3.1 TNetHttpClient在多线程中存在的问题及解决方法。的更多相关文章
- VS2012中丢失ArcGIS模板的解决方法
VS2012中丢失ArcGIS模板的解决方法 由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及ArcObjec ...
- sqlite:多线程操作数据库“database is locked”解决方法(二)
上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...
- 国内不fq安装K8S四: 安装过程中遇到的问题和解决方法
目录 4 安装过程中遇到的问题和解决方法 4.1 常见问题 4.2 常用的操作命令 4.3 比较好的博客 国内不fq安装K8S一: 安装docker 国内不fq安装K8S二: 安装kubernet 国 ...
- js中style.display=""无效的解决方法
本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多 ...
- java开发中遇到的问题及解决方法(持续更新)
摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...
- SpringBoot拦截器中无法注入bean的解决方法
SpringBoot拦截器中无法注入bean的解决方法 在使用springboot的拦截器时,有时候希望在拦截器中注入bean方便使用 但是如果直接注入会发现无法注入而报空指针异常 解决方法: 在注册 ...
- asp.net url址址中中文汉字参数传递乱码解决方法
中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下.在cs文件里传参的时候用UrlEncode: Response.Redirec ...
- @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法
JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...
- 关于验证码在IE中不刷新的快速解决方法
今天在做验证码的时候发现在IE中,验证码不会刷新,而谷歌等其他浏览器没有问题,所以我想到应该是缓存问题,因为IE默认的设置是如果访问地址没变化就不会去获取而是加载缓存中的内容 所以解决方案就是在验证码 ...
随机推荐
- Nim or not Nim? HDU - 3032
题意:给定n堆石子,两人轮流操作,每次选一堆石子,取任意石子或则将石子分成两个更小的堆(非0),取得最后一个石子的为胜. 题解:比较裸的SG定理,用sg定理打表,得到表1,2,4,3,5,6,8,7, ...
- 电影《Green book》观后感_已补全:携带着种族歧视的“光环”,艰难地获得朋友的相互依赖,依然得享受生活的酸甜苦咸。
目录 1.电影基本情况介绍 2.故事整个发展经历 3.观影感受 4.网友评论 <Green book>--绿皮书 作者总共看这部影片三次,第一次英文版慢看,第二次中文版快看,第三次中文版总 ...
- Leetcode 128 *
class Solution { public: int longestConsecutive(vector<int>& nums) { ; unordered_map<in ...
- ActiveMQ producer 流量控制
http://activemq.apache.org/producer-flow-control.html 翻译: 流量控制是指:如果broker检测到destination的内存限制.temp文件限 ...
- IDA 逆向工程 反汇编使用
IDA pro 7.0版本 from:freebuf 用到的工具有IDA pro 7.0 ,被反汇编的是百度云(BaiduNetdisk_5.6.1.2.exe). 首先,IDA pro的长相如下: ...
- python(2)之列表
列表的使用 names=["zhangyang","liming",["sese","popo"],"xiao ...
- h5的坑
转自 http://www.mahaixiang.cn 解决各种坑 http://www.mahaixiang.cn/ydseo/1529.html
- MySql多个count查询
现有一个student表结构数据如下: id hight sex age 1 160 0 16 2 170 1 16 3 180 1 17 4 160 1 16 5 170 ...
- hdu 2065 "红色病毒"问题(快速幂求模)
n=1 --> ans = 2 = 1*2 = 2^0(2^0+1) n=2 --> ans = 6 = 2*3 = 2^1(2^1+1) n=3 --> ans = 20 ...
- LY.JAVA.DAY12.Scanner
2018-07-24 13:23:18 Scanner类 一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器 package cn.itcast_01; /* * Scanner:用于接收键 ...