Waiting for Invoke to finish when using IOmniTaskControl/TOmniWorker

Viewed 582

I've created an IOmniTaskControl using a TOmniWorker, so that I can periodically run chunks of code an a specific thread. So I'll be calling Invoke as needed on this IOmniTaskControl. When I do so, I will sometimes need to wait for the execution associated with that work to complete.

I tried calling WaitFor(INFINITE) on the IOmniTaskControl after the Invoke, but it hangs. I debugged and could see the method on the Invoke call completed. Am I misunderstanding the use of WaitFor with IOmniTaskControl when used with a TOmniWorker?

Edit: I edited up the test_43_InvokeAnonymous project in the test folder and I see the same behavior:

procedure TfrmInvokeAnonymousDemo.btnInvokeClick(Sender: TObject);
var
  formThreadID: DWORD;
  task        : IOmniTaskControl;
begin
  formThreadID := GetCurrentThreadID;
  if Sender = btnInvoke then
    task := FTask
  else
    task := FMonitoredTask;

  task.Invoke(
    procedure (const task: IOmniTask)
    var
      taskThreadID: DWORD;
    begin
      // this will execute in the context of the worker thread
      taskThreadID := GetCurrentThreadID;
      Sleep(2000);
//      task.Invoke(
//        procedure
//        begin
//          // this will execute in the context of the main thread
//          frmInvokeAnonymousDemo.lbLog.Items.Add(Format(
//            'Current thread ID: %d, task thread ID: %d, ' +
//            ' form thread ID: %d',
//            [GetCurrentThreadID, taskThreadID, formThreadID]));
//        end
//      );
    end
  );

  task.WaitFor(INFINITE);
  frmInvokeAnonymousDemo.lbLog.Items.Add('Done waiting.');
end;

With the above code, the task.WaitFor(INFINITE); hangs.

1 Answers
Related