MessageDialogの連続表示

public static class MessageDialogExtensions
{

  // 最後にContinuousShowAsyncに指定されたMessageDialogのShowAsyncの戻り値
  private static Task<IUICommand> _current = Task.FromResult<IUICommand>(null);
  // 同時にContinuousShowAsyncが呼ばれた時に_currentの変更を同期化するためのロックオブジェクト
  private static object _lockContinuous = new object();

  /// <summary>
  /// MessageDialogを表示中に別のMessageDialogを単純に表示しようとするとエラーになるので、エラーにせずに順番に表示するためのメソッド。
  /// 使い方はShowAsyncと同じ。
  /// このメソッドを呼んだ後にキャンセルはできないので注意。
  /// </summary>
  /// <param name="dialog"></param>
  /// <returns></returns>
  public static async Task<IUICommand> ContinuousShowAsync(this MessageDialog dialog)
  {
    lock (_lockContinuous)
    {
        Func<Task<IUICommand>, Task<IUICommand>> chain = async (t) =>
        {
            return await dialog.ShowAsync().AsTask();
        };
        _current = _current.ContinueWith(chain).Unwrap();
    }
    return await _current;
  }

}