QC上有人提出,下面两个方法配对调用时,因线程不安全而出错,QC地址:https://quality.embarcadero.com/browse/RSP-27771

TRttiContext.KeepContext;
TRttiContext.DropContext;

我把提出者的代码改了下,测试结果果真如此,下面是测试代码:

procedure TForm61.Button1Click(Sender: TObject);
var
 i : Integer;
begin
  for i := 0 to 1000 do
  begin
//    TThread.CreateAnonymousThread(
//      procedure ()
//      var
//        j : Integer;
//      begin
//        for j := 0 to 100000 do
//        begin
//          TRttiContext.KeepContext;
//          TRttiContext.DropContext;
//        end;
//
//      end
//    ).Start;

  Scheduler.Run(procedure
                var
                  j : Integer;
                begin
                  for j := 0 to 100000 do
                  begin
                    TRttiContext.KeepContext;
                    TRttiContext.DropContext;
                  end;
                end)
           .WhenException(
                           procedure (const AException:Exception)
                           begin
                                ShowMessage(AException.Message);
                           end).Activate;

  end

end;

运行,会产生大量错误:

TRttiContext.DropContext线程不安全_编程

现在,官方Open了这个问题。

这个bug产生的后果,就是使得WebBroker及DataSnap应用在高并发情况下不稳定。问题提出者也是在做压力测试时发现的问题。在官方未解决前,你能做的就是去投票,督促官方修正。https://quality.embarcadero.com/browse/RSP-27771

测试环境:Delphi 10.3.3。