红鱼儿

Scheduler的WaitRun存在卡死的问题

为了重显问题,写了下面的代码,重显问题。

有两种情况,第一种是在Run方法中,产生异常,这会造成主线程中执行的ev.WaitRun进入死循环。第二种是不在Run方法中产生异常,而是写了AfterRun子句,这也产生同样的问题。对此,写了测试项目并反馈给作者,期待下一版本能修正。

这个问题很严重的,因为作者在其代码中也有多处使用了WaitRun,我是使用文件比较的功能时,发现了这个问题。

procedure TForm2.Button1Click(Sender: TObject);
var
  ev: IkbmMWScheduledEvent;
begin
  ev := Scheduler.Run(
                      procedure(const AEvent: IkbmMWScheduledEvent)
                      begin
                          raise Exception.Create('Error Message');
                      end)
                 .WhenException(
                                procedure(const AEvent: IkbmMWScheduledEvent; const AException: Exception)
                                begin
                                      TThread.Synchronize(nil,procedure
                                                              begin
                                                                    Label1.Caption:='Exception:'+AException.Message;
                                                                    Label1.Update;
                                                              end);
                                end)
                 .Precise
                 .Activate;

  try
//
  finally
     ev.WaitRun; // Wait forever
  end;
  ShowMessage('Scheduled Event is finish!'); //Can’t execute here

end;


procedure TForm2.Button2Click(Sender: TObject);
var
  ev: IkbmMWScheduledEvent;
begin
  ev := Scheduler.Run(
                      procedure(const AEvent: IkbmMWScheduledEvent)
                      begin
                          sleep(1000);
                      end)
                 .AfterRun(procedure
                           begin
                                TThread.Synchronize(nil,procedure
                                                        begin
                                                              Label1.Caption:='AfterRun';
                                                              Label1.Update;
                                                        end);
                           end)
                 .Precise
                 .Activate;

  try
//
  finally
     ev.WaitRun; // Wait forever
  end;
  ShowMessage('Scheduled Event is finish!'); //Can’t execute here

end;

 2020-06-01:kbmMW 5.12解决了!

但下面这种写法中,要把AfterRun替换成.SynchronizedAfterRun。

procedure TForm2.Button2Click(Sender: TObject);
var
  ev: IkbmMWScheduledEvent;
begin
  ev := Scheduler.Run(
                      procedure(const AEvent: IkbmMWScheduledEvent)
                      begin
                          sleep(1000);
                      end)
                 .AfterRun(procedure
                           begin
                                TThread.Synchronize(nil,procedure
                                                        begin
                                                              Label1.Caption:='AfterRun';
                                                              Label1.Update;
                                                        end);
                           end)
                 .Precise
                 .Activate;

  try
//
  finally
     ev.WaitRun; // Wait forever
  end;
  ShowMessage('Scheduled Event is finish!'); //Can’t execute here

end;

 后记:2024-3-19,还是如此,要把AfterRun替换成.SynchronizedAfterRun。

posted on 2020-05-26 17:02  红鱼儿  阅读(518)  评论(0编辑  收藏  举报