当我使用 AsyncCalls 时,如何最好地将异常放入主线程?例如:
procedure TUpdater.needsToGoFirst();
begin
asyncCall := TAsyncCalls.Invoke(procedure
begin
//some stuff
if (possiblyTrueCondition = True) then
raise Exception.Create('Error Message');
//more stuff
TAsyncCalls.VCLSync(procedure
begin
notifyUpdates();
end);
end);
end;
procedure TUpdater.needsToGoSecond();
begin
asyncCall2 := TAsyncCalls.Invoke(procedure
begin
//initial stuff
asyncCall.Sync();
//stuff that needs to go second
TAsyncCalls.VCLSync(procedure
begin
notifyUpdates();
end);
end);
end;
我知道调用asycCall.Sync
会为我抛出异常,但由于我目前让我的线程通知主线程已进行更新的方式,我真的没有我Sync
在主线程中调用的任何地方。这样做也很困难,因为我实际上有另一个线程正在调用Sync
以确保在获取第一个线程应该首先处理的资源之前设置一些东西。
我是否需要用 try-catch 包装这些函数的内部结构并使用 aVCLSync
自己获取主线程的异常?有没有更好的方法来检查某种主线程空闲循环中的异常?
编辑 1
我的另一个想法是创建一个循环,其唯一工作是检查 IAscynCall 引用是否存在异常,并使用它向主线程引发异常,而不是在每个帖子中复制该代码。该needsToGoSecond
方法仍然可能首先到达异常,但它会保持异常并且循环会在那里捕获它。