gpt4 book ai didi

multithreading - 如何在不调用 .Sync 的情况下处理 AsyncCalls 函数中抛出的异常?

转载 作者:行者123 更新时间:2023-12-03 17:59:31 24 4
gpt4 key购买 nike

当我使用 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 包装这些函数的内部结构并使用 VCLSync 自己获取主线程的异常?有没有更好的方法来检查某种主线程空闲循环中的异常?

编辑 1

我的另一个想法是创建一个循环,其唯一工作是检查 IAscynCall 引用中的异常,并使用它来将异常引发到主线程,而不是在每个帖子中重复该代码。 needsToGoSecond 方法可能仍然会先处理异常,但它会保留异常,循环会在那里捕获它。

最佳答案

您陈述以下内容:

I really don't have anywhere that I'm calling Sync in the main thread. Doing so also proves difficult because I actually have another thread that is calling Sync.

....

Do I need to wrap the innards of these functions with a try-catch and use a VCLSync to get the exception to the main thread myself? Is there a better way to check for exceptions in a main thread idle loop of some kind?

在另一个线程中调用 Sync 将在那里引发异常。如果你不希望它在那里引发,并且如果它必须在主线程中引发,那么没有选择。您只需自己在异步过程中捕获任何未处理的异常。然后,您可以将它们排队到主线程,可能是通过调用 TThread.Queue、发布 Windows 消息或某种类似的队列机制。如果您不介意此时的同步,另一种选择是使用 VCLSync

底线是从另一个线程调用Sync,并且需要在主线程上引发异常,这不是兼容的目标。因此,您必须自己捕获异常并停止处理它的 AsyncCalls。

从本质上讲,这只是您当前方法的扩展。目前,您向主线程发送通知,而不是让主线程同步。毕竟,我猜你正在使用异步方法,因为你不想从主线程同步。所以,扩展就是你需要能够通知主线程错误和异常,以及更正常的结果。

关于multithreading - 如何在不调用 .Sync 的情况下处理 AsyncCalls 函数中抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12362851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com