【问题标题】:ShowDialog Method in the Task任务中的 ShowDialog 方法
【发布时间】:2013-12-28 20:35:48
【问题描述】:

我在我的 WPF 应用程序中使用了一个线程和一个 Dispatcher 事件。在此我使用 ShowDialog() 方法打开新窗口 mywindow。我只想在 mywindow 对话框关闭后在“continuewith”事件中执行 loadData() 方法。我怎样才能做到这一点?现在 LoadData 方法在关闭 mywindow 对话框之前执行。

Thread thread = new Thread(() =>
{
  Application.Current.Dispatcher.BeginInvoke( new Action( () =>
  {
    Window mywindow = new Window();
    mywindow.ShowDialog();
  } ) );
}.ContinueWith( ( test ) =>
{
  LoadData();
} ) );

【问题讨论】:

  • 你为什么要使用线程来显示窗口...?这没有任何意义。这应该足够了... Window mywindow = new Window(); mywindow.ShowDialog(); Task.StartNew(() =>{ LoadData(); });

标签: c# wpf mvvm


【解决方案1】:

您正在使用 BeginInvoke 在 UI 调度程序上执行 asynchronous call,因此即使在等待对话框窗口出现之前任务也已完成。

您应该使用Invoke 执行synchronous call,除非对话框窗口打开,否则任务不会完成。

Application.Current.Dispatcher.Invoke(new Action(() =>
   {
        Window mywindow = new Window();
        mywindow.ShowDialog();
   }

在旁注中,我认为您错误地粘贴了Thread,它应该是Task

        Task thread =Task.Factory.StartNew(() =>
        {
            Application.Current.Dispatcher.Invoke(new Action(() =>
            {
                SecondaryWindow mywindow = new SecondaryWindow(new VM());
                mywindow.ShowDialog();
            }));
        }).ContinueWith((test) =>
        {
            LoadData();
        });

【讨论】:

    【解决方案2】:

    您应该使用同步调用而不是使用 Invoke 的异步调用。这将调用 LoadData 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      相关资源
      最近更新 更多