是async await函数,什么都不返回,与非异步版本相同?

时间:2017-07-13 12:17:15

标签: c# asynchronous

我刚开始在我的C#代码中使用asyncawait。我刚刚发现自己写了一个类似于以下的函数......

class Database
{
  DatabaseConnection connection;

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

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

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

或者异步版本是否有根本改进使其更好?

1 个答案:

答案 0 :(得分:1)

当然他们不一样!

您的推理可能是因为该方法没有返回任何内容,因此您无需等待它完成。

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

例如,

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

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

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

现在看到差异?