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在多线程中存在的问题及解决方法。的更多相关文章

  1. VS2012中丢失ArcGIS模板的解决方法

    VS2012中丢失ArcGIS模板的解决方法 由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及ArcObjec ...

  2. sqlite:多线程操作数据库“database is locked”解决方法(二)

    上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...

  3. 国内不fq安装K8S四: 安装过程中遇到的问题和解决方法

    目录 4 安装过程中遇到的问题和解决方法 4.1 常见问题 4.2 常用的操作命令 4.3 比较好的博客 国内不fq安装K8S一: 安装docker 国内不fq安装K8S二: 安装kubernet 国 ...

  4. js中style.display=""无效的解决方法

    本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多 ...

  5. java开发中遇到的问题及解决方法(持续更新)

    摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...

  6. SpringBoot拦截器中无法注入bean的解决方法

    SpringBoot拦截器中无法注入bean的解决方法 在使用springboot的拦截器时,有时候希望在拦截器中注入bean方便使用 但是如果直接注入会发现无法注入而报空指针异常 解决方法: 在注册 ...

  7. asp.net url址址中中文汉字参数传递乱码解决方法

    中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下.在cs文件里传参的时候用UrlEncode: Response.Redirec ...

  8. @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法

    JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...

  9. 关于验证码在IE中不刷新的快速解决方法

    今天在做验证码的时候发现在IE中,验证码不会刷新,而谷歌等其他浏览器没有问题,所以我想到应该是缓存问题,因为IE默认的设置是如果访问地址没变化就不会去获取而是加载缓存中的内容 所以解决方案就是在验证码 ...

随机推荐

  1. 6月16 ThinkPHP连接数据库及Model数据模型层--------查询及数据添加

    连接数据库配置及Model数据模型层 convertion.php config.php 1.在config.php做数据库连接配置 2.修改配置 /* 数据库设置 */ 'DB_TYPE' => ...

  2. js将url转换二维码

    二维码生成库 qrcode.js /*from tccdn minify at 2014-6-4 14:59:43,file:/cn/c/c/qrcode.js*/ /** * @fileovervi ...

  3. 关于linux中用vi新建立一个.c文件无法保存,显示E212错误的时候

    在ubuntu16.04环境下,用vi新键.c文件,怎么保存也不能 先按ESC  然后:  在后wq  可是显示文件212错误. 后来知道在建立.c的文件夹的权限不对.这里的权限用 ls -l来查看 ...

  4. Oracle11g版本中未归档隐藏参数

    In this post, I will give a list of all undocumented parameters in Oracle 11g. Here is a query to se ...

  5. Microsoft Windows远程桌面协议中间人攻击漏洞(CVE-2005-1794)漏洞解决方案(Windows server2003)

    1.启动“终端服务配置” 2.选择“连接”,看到“RDP-Tcp”,在其上右键,选择“属性” 3.“常规”选项卡,将加密级别修改为“符合FIPS标准”,点击应用 应用即可,实验发现并不需要重启服务或操 ...

  6. Mybatis排序无效问题解决

    在 mybatis 的 xml中,为一个SQL语句配置order by 子句时,需要这个排序的字段是前端传递过来的,而且排序的顺序(升序 OR 降序)也是由前端传递过来的.对于这种需求,我起初写成了下 ...

  7. span 超出部分换行

    span{ word-break: normal; width: auto; display: block; white-space: pre-wrap; word-wrap: break-word; ...

  8. Oracle中如何停止正在执行SQL语句

    oracle的用P/SQL客户端中,如何停止正在执行的SQL语句? 我们使用oracle语句查询某个表时,如果查询的表数据太多,如何停止正在执行操作 如查询的表数据超过上万条时,如何停止查询操作

  9. Win10系列:VC++媒体播放控制4

    (7)音量控制 MediaElement控件具有一个Volume属性,通过设置此属性的值可以改变视频音量的大小.接下来介绍如何实现视频的音量控制,首先打开MainPage.xaml文件,并在Grid元 ...

  10. 尚学堂java 答案解析 第五章

    本答案为本人个人编辑,仅供参考,如果读者发现,请私信本人或在下方评论,提醒本人修改 一.选择题 1.AB 解析:A可以被所有类访问,B可以被当前包的所有类访问,也可以被所有子类访问 2.A 解析:所有 ...