等不及等待电话

时间:2015-09-16 01:50:21

标签: c# asynchronous mahapps.metro

我正在使用SimpleChildWindowusage guide有关于如何使用的示例。我用这个作为指南:

private async void OpenAChildWindow_OnButtonClick(object sender, RoutedEventArgs e)
{
  // opens a cool child window
  await this.ShowChildWindowAsync(new CoolChildWindow() { IsModal = false });
}

我正在按下按钮点击甚至处理程序,如下所示:

private async void OnChildWindowClick(object sender, RoutedEventArgs e)
{
    await Task.Delay(10000);
    await this.ShowChildWindowAsync(new SimpleChildWindowImplementation() { IsModal = false, AllowMove = true, Title = "This is title" });
    Console.WriteLine("Hello");
}

我看到await正确等待10秒。然而,第二次等待并不等待。然后控制台还会显示调试“Hello”。当我退出click处理程序方法时,会显示子窗口。

为什么它不首先显示子窗口然后显示调试“Hello”消息?

SimpleChildWindowImplementation现在与提供的示例中的CoolChildWindow完全相同。我的想法是稍后改变它以满足我的需要。

修改

我更改了ChildWindowManager.cs并调整了ShowChildWindowInternalAsync函数的实现,如下所示。

private static Task<string> ShowChildWindowInternalAsync(ChildWindow dialog, Panel container)
{
    var tcs = new TaskCompletionSource<string>();

    var firstTask = Task.Factory
               .StartNew(() => dialog.Dispatcher.Invoke(new Action(() => container.Children.Add(dialog))));

    var continuationTask = firstTask.ContinueWith(_ => dialog.Dispatcher.Invoke(
            new Func<Task>(() =>
               {
                   RoutedEventHandler handler = null;
                   handler = (sender, args) =>
                   {
                       dialog.ClosingFinished -= handler;
                       container.Children.Remove(dialog);
                       tcs.TrySetResult("done");
                   };
                   dialog.ClosingFinished += handler;
                   dialog.IsOpen = true;
                   return tcs.Task;
               })));

    return tcs.Task;
}

不将其标记为答案。等待来自@ punker76的反馈。

1 个答案:

答案 0 :(得分:2)

我刚看了一下源代码。

基本上,ShowChildWindowAsyncChildWindow的{​​{1}}设置为IsOpen。这会触发true,最终会调用

IsOpenedChanged

VisualStateManager.GoToState(childWindow, (bool)e.NewValue == false ? "Hide" : "Show", true); GoToState的更改都会立即返回,实际结果(窗口的外观)会在以后异步生效。