これは私の他の質問How to cancel background printingに関連しています。CancellationTokenSourceを使って別のスレッドのダイアログを閉じるには?
私はCancellationTokenSourceモデルをよりよく理解しようとしています。スレッド境界をまたいで使用する方法を理解しています。
私はコードが背後ん(UIスレッド上の)メインウィンドウがあります。それが閉じているときに正しくCloseWindowコードを呼び出す
public MainWindow()
{
InitializeComponent();
Loaded += (s, e) => {
DataContext = new MainWindowViewModel();
Closing += ((MainWindowViewModel)DataContext).MainWindow_Closing;
};
}
を:
private void CloseWindow(IClosable window)
{
if (window != null)
{
windowClosingCTS.Cancel();
window.Close();
}
}
の選択にはメニュー項目、バックグラウンドスレッド上に第2のウィンドウが作成されます。
In the MainWi ndowViewModel(UIスレッド上では)、私が入れ:
public CancellationTokenSource windowClosingCTS { get; set; }
のコンストラクタで:
// Constructor
public MainMenu()
{
readers = new List<Reader>();
CloseWindowCommand = new RelayCommand<IClosable>(this.CloseWindow);
windowClosingCTS = new CancellationTokenSource();
}
今私の問題。 UIスレッドでMainWindowを閉じると、windowClosingCTS.Cancel()によって、ctで登録されたデリゲートへの即時呼び出しが発生します。つまり、previewWindow.Close()が呼び出されます。異なる スレッドがそれを所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできません 『
をそう:"
(!Windowsの= NULL)とした場合、』これは今すぐに戻って投げます。私が間違って何をやっている?
:あなたはあなたのソリューションで滞在したい場合は、バックグラウンドスレッドからキャンセルをトリガしたい場合
または、あなたはあなたのウィンドウがで開かれているスレッドに、あなたの近くに操作をマーシャリングする必要がありますあなたはWPFを使用していますか? –
このプロセスでは、マルチスレッドを使用しないでください。あなたはCPUに束縛されていません。非同期シングルスレッドを使用することに固執する。 – Aron
@ d.moncadaはいMVVM。 –