当我使用AsyncCalls时,如何最好地将异常传递到主线程?例如:
我知道调用`asycCall.Sync`会为我抛出异常,但由于我当前的线程通知主线程已经更新了,我真的没有在主线程中调用`Sync`的地方。这样做也很困难,因为我实际上还有另一个线程在调用`Sync`,以确保一些东西设置好了,然后才获取第一个线程应该处理的资源。
我需要用try-catch包装这些函数的内部并使用`VCLSync`自己将异常传递到主线程吗?还是有更好的方法在某种主线程空闲循环中检查异常? 编辑1 我想到的另一个想法是创建一个循环,其唯一的工作是检查IAscynCall引用是否有异常,并使用它将异常提升到主线程,而不是在每个post中重复该代码。`needsToGoSecond`方法可能仍然会先遇到异常,但它将保留异常,循环将在那里捕获它。
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包装这些函数的内部并使用`VCLSync`自己将异常传递到主线程吗?还是有更好的方法在某种主线程空闲循环中检查异常? 编辑1 我想到的另一个想法是创建一个循环,其唯一的工作是检查IAscynCall引用是否有异常,并使用它将异常提升到主线程,而不是在每个post中重复该代码。`needsToGoSecond`方法可能仍然会先遇到异常,但它将保留异常,循环将在那里捕获它。