2012-10-22 40 views
1

我們得到了一個長時間運行的作業,它需要一個作業詳細信息列表,並且不共享試圖在WPF MVVM .Net 4項目中運行的狀態。看起來任務並行庫是最好的選擇,因爲它在後臺線程上運行並允許並行處理。我創建了一個原型應用程序,它也使用MVVM-Light作爲RelayCommands。示例「aTplTest.7z」位於https://skydrive.live.com/redir?resid=DA3E430C1A5F3B81!186&authkey=!AOOWYGbB_PToC5ATPL WPF MVVM如何讓它工作?

該原型主要工作(只運行斐波那契計算器進行測試),除了以下內容。

  1. 如何將視圖顯示爲對話框並讓它自動啓動長時間運行的過程? (目前的工作是讓用戶按一個開始按鈕。)
  2. 如何讓用戶關閉視圖,並且在取消當前作業實例時不讓任務創建異常?

(例如,如果用戶按下視圖關閉窗口按鈕,捕捉的Invoke方法創建另一個例外。)

private bool CreateVouchers(int[] workList) 
    { 
     var loopOptions = new ParallelOptions(); 
     loopOptions.CancellationToken = TokenSource.Token; 
     var success = false; 
     try 
     { 
      Parallel.ForEach(workList, loopOptions, t => BuildVoucher(t)); 
      success = true; 
     } 
     catch (OperationCanceledException) 
     { 
      var scm = new Action(ShowCancellationMessage); 
      Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, scm); 
     } 
     return success; 
    } 

我會更新這個帖子,並與任何解決方案的源例子。

回答

1

自動啓動您的長時間運行過程只需添加以下Window_Loaded處理程序代碼隱藏在那裏你定義您的WINDOW_CLOSING處理程序:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    var viewModel = (VoucherBuilderViewModel)this.DataContext; 
    viewModel.CancelCommand.Execute(null); 
} 

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    var viewModel = (VoucherBuilderViewModel)this.DataContext; 
    viewModel.RunJob(); 
} 

當然,不要忘記在註冊事件處理程序的XAML:

<Window Closing="Window_Closing" Loaded="Window_Loaded"> 

和關閉窗口,只需添加下面的空當檢查擺脫了異常:

catch (OperationCanceledException) 
{ 
    if (Application.Current != null) 
    { 
     var scm = new Action(ShowCancellationMessage); 
     Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, scm); 
    } 
} 
+0

當然。謝謝。隨着密切的問題,我最終執行檢查,如果ViewModel忙,然後e。在關閉時取消= true,告訴用戶先取消該過程。 – Cheval

0

不完全確定你所問的所有細節,但我可以嘗試解決這兩個問題。

  1. 顯示視圖的對話框:你的意思是,這是一個模式對話框 ?如果視圖派生自Window(我假設它不是那麼簡單,那麼它就是 ),只需調用view.ShowDialog();
    至於開始長時間運行的過程,可以連接到OnLoaded, 或在構造函數中運行它。

  2. 註冊一種關閉視圖的方式,包括在循環選項上使用您的 取消令牌。在生成憑證中,只需檢查 以查看取消令牌是否有請求取消 並正常停止生成消息並清理。

我希望這會有所幫助。如果您添加評論,我可能會發現更多的信息。

+0

1)是的,OnLoaded從Context獲取ViewModel是答案。 2)bug解決了這個問題。謝謝。 – Cheval