【发布时间】: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 正在返回什么。它表现得好像它正在返回一个什么都没有的任务,所以虽然我认为这不是正在发生的事情,但我还没有找到任何关于它在做什么的文档。有什么想法吗?
【问题讨论】:
-
找出不同之处:
TaskvsTask<T> -
它只是返回一个没有结果的非泛型
Task..。不返回void背后的原因是因为Task包装了异常以及执行期间是否存在错误等内容。返回void不会给你任何这些,并假设你在你的方法中处理它。 -
@spender 比我想象的还要简单
-
@SimonWhitehead,如果您将其发布为答案,那就太好了,伙计。
-
@Noseratio 被Servy打败了。不知道我可以添加更多:)