Delphi 在不阻塞主线程的情况下获得 TTask.IFuture?

Delphi getting TTask.IFuture without blocking main thread?

在下面的示例中(来自 Embarcadero 的手册),大约 3 秒后将检索 MyValue。但是,主 gui 线程将被 MyValue 阻塞:= FutureObject.Value;将等待结果的调用。 如果 Future 代码需要很长时间,比方说 30 秒,我猜 Windows 将在程序标题中显示“...未响应”。 那么,当它阻塞主 gui 线程时,它的目的是什么? 有没有其他方法可以在不阻塞主 gui 线程的情况下获得结果?

FutureObject := TTask.Future<Integer>(function: Integer
    begin
        Sleep(3000);
        Result := 16;
    end);
// …
MyValue := FutureObject.Value;

根据设计,IFuture.Value 属性 会阻塞调用线程,直到另一个线程分配一个值。因此,如果您在主线程中读取 Value,它将阻塞主线程,直到准备好一个值。

如果你必须在主线程中不阻塞地读取Value,你可以:

  • 使用计时器或其他异步机制定期查询 IFuture.Status 属性 以检查 IFuture 何时准备好在实际读取值之前提供值.

  • 让并行任务在准备就绪时向主线程发送信号,然后主线程可以在其信号处理程序中读取Value

我知道这可能有点晚了,但我通过创建一个 TTask 来解决它 我的价值 := FutureObject.Value

FutureObject := TTask.Future<Integer>(function: Integer
begin
    Sleep(3000);
    Result := 16;
end);
// …
TTask.Run(Procedure begin
MyValue := FutureObject.Value;
end);