不返回任何内容的异步等待函数是否与非异步版本相同?



我是第一次在 C# 代码中使用asyncawait。我刚刚发现自己编写了一个类似于以下内容的函数......

class Database
{
DatabaseConnection connection;
async void Close()
{
await connection.CloseAsync();
}
}

但是,我的Close方法是否与仅使用以下方法相同......

void Close()
{
connection.Close();
}

还是异步版本有根本性的改进使其变得更好?

当然,它们不一样!

您的推理可能是,由于该方法不返回任何内容,因此您不必等待它完成。

但事实是,每个非异步方法都是同步的,无论它是否返回值。

例如

connection.Close();
Console.WriteLine("Closed");

Close是同步的。"关闭"仅在关闭完成后打印。但是,如果在此处使用CloseAsync,则"Closed"将在到达CloseAsync中的await语句后立即打印,并且关闭操作将开始异步运行。这意味着,当打印"关闭"时,关闭操作可能尚未完成。

此外,如果您使用的是 GUI,则在主线程上调用Close将导致 UI 冻结,因为它是同步的。无论是否返回值,操作仍然需要时间,对吗?

现在看到区别了吗?

相关内容

  • 没有找到相关文章

最新更新