2012-07-31 70 views
4

即使在查看關於Dispatcher.Invoke的各種信息後,我仍然無法解決問題。使用Dispatcher.Invoke從WPF中的不同線程關閉窗口

有一個MainWindow創建一個任務,啓動該任務,然後打開一個進度窗口。任務完成後,我需要關閉進度窗口。下面是我有:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Task task = new Task(_vm.WriteToDB); 
     task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted); 
     task.ContinueWith(RanToCompletion, TaskContinuationOptions.OnlyOnRanToCompletion); 
     task.Start(); 

     _frmProgress = new Progress(task); 
     _frmProgress.DataContext = _vm; 
     _vm.ProgressText = "Connecting to update server..."; 
     _frmProgress.ShowDialog(); 
    } 

    public void RanToCompletion(Task task) 
    { 
     Progress.FormCloseDelegate FormCloseDelegate = new Progress.FormCloseDelegate(_frmProgress.Close); 

     if (_frmProgress.Dispatcher.CheckAccess()) 
      _frmProgress.Close(); 
     else 
      _frmProgress.Dispatcher.Invoke(DispatcherPriority.Normal, FormCloseDelegate); 
    } 

FormCloseDelegate在進度窗口定義:

public delegate void FormCloseDelegate(); 

通過上面的當前實現,代碼可以編譯和運行,但一旦任務完成進度的形式沒有關閉。有任何想法嗎?

我也打開其他想法來解決這個問題。也許我完全走錯了路。

謝謝。

+0

你有沒有嘗試過的,而不是調用BeginInvoke的:

我意識到,我並不需要在所有的自定義委託後更新RanToCompletion方法? – 2012-07-31 19:39:17

+0

是的,與BeginInvoke的結果相同。 – ChrisO 2012-07-31 19:41:13

+0

試過DispatcherPriority.Send?它可能正在排隊,並且在您的進度對話框退出之前不會調度。 – 2012-07-31 19:43:34

回答

7

就像我在評論中提到的,當用戶在Window_Closing事件中用e.Cancel = true點擊關閉按鈕時,我阻止關閉進度窗口。這阻止了代碼中的調用來關閉窗口。

public void RanToCompletion(Task task) 
    { 
     if (_frmProgress.Dispatcher.CheckAccess()) 
      _frmProgress.Close(); 
     else 
      _frmProgress.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(_frmProgress.Close)); 
    }