Ссылаясь на документацию 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; }
}
}
Мой актер:
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);
}
}
}
Чтобы перехватывать исключения в указанном выше акторе, мне нужно добавить еще один обработчик Receive для обработки исключений, как, например, ниже:
Receive<Exception>(x => SomeExceptionHandler(x));
Это правильно? Если да, то нет ли необходимости в try {} catch {}
вокруг моего блока кода?