Насколько правильно использовать `Result` внутри` Task.Run` - PullRequest
0 голосов
/ 11 мая 2019

В Akka.Net есть красивый дизайн внутри актера, чтобы начать задачу с Task.Run и передать результат обратно актеру:

Task.Run(() => Method(...)).PipeTo(self);

Обратите внимание, что IO не задействовано.
Внутри
Model Method(...)
есть небольшая предварительная обработка, затем я должен ждать вызова Task<Model> и немного последующей обработки.
Task<Model> находится в сторонней библиотеке, я не могу ее изменить.
В настоящее время я делаю var model = proxy.GetModel(..).Result внутри try catch.
Возможный AggregateException учитывается.

Другая идея состоит в том, чтобы использовать это с await.
var model = await proxy.GetModel(..) внутри try catch и изменение подписи на
async Task<Model> Method(...)

Как мне изменить вызов метода в актере?

Task.Run(() => Method(...).Result).PipeTo(self);
Task.Run(async () => await Method(...)).PipeTo(self);

Какой подход лучше, в чем разница?

1 Ответ

2 голосов
/ 11 мая 2019

Result блокирует поток и переносит все исключения в AggregateException.По этим причинам я обычно предпочитаю await.

. В этом случае вы можете исключить async / await:

// Same as:
// Task.Run(async () => await Method(...)).PipeTo(self);
Task.Run(() => Method(...)).PipeTo(self);
...