正确使用OmniThreadLibrary未来的方法

Pri*_*nah 0 delphi multithreading omnithreadlibrary

我目前正在尝试使用OmniThreadLibrary.随函附上我的代码:

procedure TMainForm.LongWait;
begin
  Task := Parallel.Future<string>(
    function: string
    begin
      Sleep(10000);
      Result := 'Done';
    end,

  Parallel.TaskConfig.OnTerminated(
    procedure
    begin
      if Task.IsDone then
        MessageDlg('Complete', mtInformation, [mbOK], 0)
      else
        MessageDlg('Exception', mtError, [mbCancel], 0)
    end)
  );
end;
Run Code Online (Sandbox Code Playgroud)

我会调用LongWait(),它可以正常工作而不会阻止UI.我想做的是:

  • 让任务在等待值的同时在后台运行
  • 如果引发异常,我希望主线程捕获它
  • 允许主线程确定任务是完成还是取消

有可能做一个非阻塞功能,可以做所有这些吗?

先感谢您,

V.

编辑:添加问题

gab*_*abr 6

let the task run in the background while waiting for the value

您可以通过几种不同的方式等待结果:

  • 调用Task.Value将阻塞直到计算值.
  • Task.IsDone定期打电话,然后Task.ValueIsDone退货时打电话True.
  • Task.TryValue定期打电话.
  • 获取termination(OnTerminated)处理程序中的值.

if an exception is raised, I want the main thread to catch it

异常将自动转发到您的代码读取未来结果的位置.由于您没有在任何地方阅读结果,因此您只需if assigned(Task.FatalException)OnTerminated处理程序中使用即可.(顺便说一句,IsDone在终止处理程序中总是如此.)

allow the main thread to determine if the task was completed or cancelled

使用Task.IsCancelled.

所有这些都记录在OmniThreadLibrary书籍的并行编程未来章节中.