我可以使用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返回什么。它表现得像是在返回一个没有任务的任务,所以虽然我认为这不是正在发生的事情,但我还没有找到任何关于它正在做什么的文档。有什么想法吗?
答案 0 :(得分:5)
接受Task.Run
的{{1}}超载会返回Action
。这是不 Task
,因为它没有Task<T>
,但它也不是Result
。这是一项可以完成的任务,也可以传播错误。
你可以void
它,等待它会产生一个没有价值的表达式(即await
),这意味着你不能将它分配给任何东西。如果void
返回Run
而不是void
*,则您首先无法Task
。