gpt4 book ai didi

c# - 在 Task 上使用 akka.net PipeTo() 进行异常处理

转载 作者:太空狗 更新时间:2023-10-30 00:37:33 25 4
gpt4 key购买 nike

引用 Akka.Net 文档,使用 PipeTo()在处理异步作业时首选。

处理返回 Task<T> 的函数时,我可以处理失败事件,没问题。

问题是,当处理一个不返回任何类型而只返回 Task 的函数时, 人们仍然称之为 PipeTo函数,但不再包含包含失败句柄的重载,它现在表示以下内容:“由于此任务没有结果,因此只会将异常通过管道传递给接收者。”。

这是否意味着,如果我有以下代码:

public class RepositoryComponent : IRepositoryComponent
{
private SqlSettings _sqlSettings;

public RepositoryComponent(SqlSettings sqlSettings)
{
_sqlSettings = sqlSettings;
}

public async Task InsertJobAsync(RetryModel job)
{
try
{
await... //some logic
}
catch { throw; }
}
}

我的 Actor :

public class RepositoryActor : ActorBase
{
private IRepositoryComponent _repoComponent;
private ActorSelection _retryActor;

public RepositoryActor(IRepositoryComponent repoComponent) : base()
{
_repoComponent = repoComponent;
}

public override void Listening()
{
Receive<RepositoryMessages.GenericRequestNoReturn>(x => InvokeRequest(x));
Receive<RepositoryMessages.GenericRequestWithResponseType>(x => InvokeRequestAndSendResponse(x));
}

private void InvokeRequest(RepositoryMessages.GenericRequestNoReturn msg)
{
try
{
//some logic with msg
_repoComponent.InsertJobAsync(new Core.Models.RetryModel()).PipeTo(Context.Self);
}
catch (Exception ex)
{
base.ExceptionHandling(ex);
}
}
}

为了在上面的actor中捕获异常,我需要添加另一个接收处理程序来处理异常,如下所示:

Receive<Exception>(x => SomeExceptionHandler(x));

这是正确的吗?如果是这样,则不需要 try {} catch {}在我的代码块周围?

最佳答案

如果您使用 PipeTo 调用异步操作,它不会阻塞你当前的代码执行路径。这意味着永远不会执行 try/catch 语句(因为代表异步操作的任务的成功或失败将被重定向到 Self)。

有两种方法可以处理异步操作执行期间可能发生的异常:

  1. 使用ReceiveAsync<>而不是 Receive<>与异步 lambda 结合使用 - 这将使您可以简单地 await用于完成异步操作。您可以在此上下文中自由使用 try/catch,因为它会按预期工作。请记住,这将使您的 actor 保持不可重入 - 这意味着,在当前异步操作完成之前,actor 不会处理任何消息。
  2. 保留 PipeTo并添加另一个 Receive<>逻辑中的处理程序 - 如果任务包装异步操作失败,异常将被包装到消息中并重定向回 PipeTo的目标(在您的情况下为 Self)。默认情况下,以这种方式产生的异常包含在 Status.Failure 中消息 - 在这种情况下,您需要添加 Receive<Status.Failure>你的 Actor 中的处理程序。您还可以指定用于处理 PipeTo 的自定义消息构造函数失败即:_repoComponent.InsertJobAsync(input).PipeTo(Context.Self, failure: exception => new MyErrorMessage(exception))

关于c# - 在 Task 上使用 akka.net PipeTo() 进行异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48803038/

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