【问题标题】:What does Task.Run return if what it's running has no return?如果 Task.Run 正在运行的内容没有返回,它会返回什么?
【发布时间】:2014-06-05 00:26:07
【问题描述】:

我可以像这样使用Task.Run 执行异步操作

await Task.Run(() =>
{
    DoSomeIOStuff();
    //throw new Exception("Custom Exception");
});

有时我需要返回一个值

bool success = await Task.Run(() => ...

但有时我不会。我读到您永远不应该使用返回 void 的异步方法,因为除其他外,您可能会丢失异常(如this question 中所述)。我测试了上面带有异常的 Task.Run 调用,发现所有数据都已处理,这意味着即使我没有返回任何内容,Task.Run 仍在返回任务。然后我尝试了

var temp = await Task.Run(() =>

这给了我一个错误,我无法将 void 分配给一个变量,这是我所期望的,但这让我想知道 Task.Run 正在返回什么。它表现得好像它正在返回一个什么都没有的任务,所以虽然我认为这不是正在发生的事情,但我还没有找到任何关于它在做什么的文档。有什么想法吗?

【问题讨论】:

  • 找出不同之处:Task vs Task<T>
  • 它只是返回一个没有结果的非泛型Task..。不返回void 背后的原因是因为Task 包装了异常以及执行期间是否存在错误等内容。返回void 不会给你任何这些,并假设你在你的方法中处理它。
  • @spender 比我想象的还要简单
  • @SimonWhitehead,如果您将其发布为答案,那就太好了,伙计。
  • @Noseratio 被Servy打败了。不知道我可以添加更多:)

标签: c# task-parallel-library


【解决方案1】:

接受ActionTask.Run 的重载返回Task。这不是Task<T>,因为它没有Result,但也不是void。这是一项可以完成的任务,也可以传播错误。

你可以await它,等待它会导致一个没有值的表达式(即void),这意味着你不能将它分配给任何东西。如果Run 返回void 而不是Task *那么你一开始就无法await

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 2023-03-31
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2011-02-04
    相关资源
    最近更新 更多