以下のように非async関数proc1から、awaitが必要な関数proc3を呼び出すのに async void の関数proc2を挟んでいます。
この時、proc3/proc2のすべての処理が終わってからproc1に返ってきてほしいのですが、ログを確認すると

Enter proc2⇒Enter proc3⇒proc3 start⇒Exit proc2⇒proc3 end⇒Exit proc3
となってしまいます。

Enter proc2⇒Enter proc3⇒proc3 start⇒proc3 end⇒Exit proc3⇒Exit proc2
という順序で実行させるにはどうすれば良いのでしょうか。

private void proc1()
{
  Debug.Write("Enter proc2");
  proc2();
  Debug.Write("Exit proc2");
}
private async void proc2()
{
  Debug.Write("Enter proc3");
  if(await proc3())
  {
    foo();
  }
  Debug.Write("Exit proc3");
}
private async Task<bool> proc3()
{
  Debug.Write("proc3 start");
  await bar();
  Debug.Write("proc3 end");
  return true;
}