Multithreading 未来使用OmniThreadLibrary的正确方法

Multithreading 未来使用OmniThreadLibrary的正确方法,multithreading,delphi,omnithreadlibrary,Multithreading,Delphi,Omnithreadlibrary,我目前正在试用OmniThreadLibrary。随函附上我的代码: procedure TMainForm.LongWait; begin Task := Parallel.Future<string>( function: string begin Sleep(10000); Result := 'Done'; end, Parallel.TaskConfig.OnTerminated( procedure

我目前正在试用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;
程序TMainForm.LongWait;
开始
任务:=并行。未来(
函数:字符串
开始
睡眠(10000);
结果:=‘完成’;
完,,
Parallel.TaskConfig.OnTerminated(
程序
开始
如果Task.IsDone那么
MessageDlg('Complete',mtInformation,[mbOK],0)
其他的
MessageDlg('Exception',mtError,[mbCancel],0)
(完)
);
结束;
我会调用LongWait(),它可以在不阻塞UI的情况下正常工作。我想做的是:

  • 让任务在后台运行,同时等待值
  • 如果引发异常,我希望主线程捕获它
  • 允许主线程确定任务是否已完成或取消
有没有可能做一个非阻塞函数来完成所有这些

提前谢谢大家,

五,


编辑:添加问题

让任务在后台运行,同时等待值

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

  • 调用
    Task.Value
    ,直到计算出值为止
  • 定期调用
    Task.IsDone
    ,然后在
    IsDone
    返回
    True
    时调用
    Task.Value
  • 定期调用
    Task.TryValue
  • 获取终止(
    OnTerminated
    )处理程序中的值
如果引发异常,我希望主线程捕获它

异常将自动转发到代码读取未来结果的点。由于您没有在任何地方读取结果,您只需在
OnTerminated
处理程序中使用
if assigned(Task.FatalException)
。(顺便说一句,
IsDone
在终止处理程序中始终为true。)

允许主线程确定任务是否已完成或取消

使用
Task.IsCancelled


所有这些都记录在本书的中。

让任务在后台运行,同时等待值

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

  • 调用
    Task.Value
    ,直到计算出值为止
  • 定期调用
    Task.IsDone
    ,然后在
    IsDone
    返回
    True
    时调用
    Task.Value
  • 定期调用
    Task.TryValue
  • 获取终止(
    OnTerminated
    )处理程序中的值
如果引发异常,我希望主线程捕获它

异常将自动转发到代码读取未来结果的点。由于您没有在任何地方读取结果,您只需在
OnTerminated
处理程序中使用
if assigned(Task.FatalException)
。(顺便说一句,
IsDone
在终止处理程序中始终为true。)

允许主线程确定任务是否已完成或取消

使用
Task.IsCancelled


所有这些都记录在书的结尾。

你的博客非常棒。这是在不阻塞的情况下等待值的正确方法吗?”朗威特;而不是任务。TryValue(100,Value)确实开始睡眠(500);Application.ProcessMessages;结束;'这是一种方式。你的博客很好。这是在不阻塞的情况下等待值的正确方法吗?”朗威特;而不是任务。TryValue(100,Value)确实开始睡眠(500);Application.ProcessMessages;结束;'这是一种方法。