如果正在运行的东西没有返回,Task.Run会返回什么?

时间:2014-06-05 00:26:08

标签: c# task-parallel-library

我可以使用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返回什么。它表现得像是在返回一个没有任务的任务,所以虽然我认为这不是正在发生的事情,但我还没有找到任何关于它正在做什么的文档。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

接受Task.Run的{​​{1}}超载会返回Action。这是 Task,因为它没有Task<T>,但它也不是Result。这是一项可以完成的任务,也可以传播错误。

你可以void它,等待它会产生一个没有价值的表达式(即await),这意味着你不能将它分配给任何东西。如果void返回Run而不是void *,则您首先无法Task