【问题标题】:How valid is it to use `Result` inside `Task.Run`在 `Task.Run` 中使用 `Result` 的有效性如何
【发布时间】:2019-05-11 13:23:13
【问题描述】:

在 Akka.Net 中,actor 内部有一个不错的设计,可以使用 Task.Run 启动任务并将结果通过管道传回给 actor:

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

注意,不涉及 IO。
里面
Model Method(...)
有一点预处理,然后我必须等待对Task<Model> 的调用和一点后处理。
Task<Model> 在第三方库中,我无法更改它.
目前我做 var model = proxy.GetModel(..).Resulttry catch 内。
考虑了可能的AggregateException

另一个想法是在 try catch 内使用 await
var model = await proxy.GetModel(..) 并将签名更改为
async Task<Model> Method(...)

我应该如何更改actor中对Method的调用?

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

哪种方法更好,有什么区别?

【问题讨论】:

    标签: c# async-await akka.net


    【解决方案1】:

    Result 阻塞一个线程并将任何异常包装在AggregateException 中。由于这些原因,我一般更喜欢await

    这种情况下,你可以elide the async/await:

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

    【讨论】:

    • 如果没有 async-await 关键字,我将不得不使用 Method(..) 内的任务的 Result,因为我的代码有些简化并且 Method(..) 内的后处理使用结果 - 尽管我可以重构它。
    • @Gerard:不。你可以让Method 使用async/awaitTask.Run 的任何一种形式都可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 2019-12-31
    • 2023-03-21
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多