ShowMessageAsync メソッドを使用して MahApps Metro ダイアログを使用しています。ダイアログを呼び出してキャンセルする場合があります。私はそのようにダイアログを呼び出しています
MetroDialogSettings Settings = new MetroDialogSettings();
Settings.CancellationToken = Token;
Token.ThrowIfCancellationRequested();
await this.ShowMessageAsync("Prompt", "Prompt", MessageDialogStyle.Affirmative, Settings);
そのままキャンセル
private void CancelDialog(CancellationTokenSource cts)
{
this.Dispatcher.Invoke(new Action(() => cts.Cancel()));
}
次の例を使用してテストしたところ、これはうまく機能しているようです
Task.Delay(1000).ContinueWith(_=>CancelDialog(cs));
トークンも使用しました。ThrowIfCancellationRequested();
ショーとキャンセルの間に非同期性があるためです。私の問題は、ショーの前にキャンセルすると正常に動作し、ショーの後にキャンセルすると正常に動作しますが、ショーの後0〜500ミリ秒の間にキャンセルするとNullReference例外がスローされることです。完全に初期化される前にキャンセルされた場合を除いて、MahApps コードの何かが正しくないことが原因のようです。ロックする方法を見つけようとしたので、初期化後にのみキャンセルできますが、準備ができているかどうかを確認する方法が見つかりませんか?
アップデート:
これは、何が失敗するかまで単純化されています。次のコードは、NullRefernce 例外をスローします。
CancellationTokenSource cs = new CancellationTokenSource();
MetroDialogSettings settings = new MetroDialogSettings();
settings.CancellationToken = cs.Token;
this.ShowMessageAsync("Prompt", "Prompt", MessageDialogStyle.Affirmative, settings);
this.Dispatcher.Invoke(new Action(() => cs.Cancel()));
更新 2: これにより例外が発生します。
CancellationTokenSource cs = new CancellationTokenSource();
MetroDialogSettings settings = new MetroDialogSettings();
settings.CancellationToken = cs.Token;
var result = this.ShowMessageAsync("Prompt", "Prompt", MessageDialogStyle.Affirmative, settings);
Task.Delay(400).ContinueWith(_ => this.Dispatcher.Invoke(new Action(() => cs.Cancel())));
これはしませんが:
CancellationTokenSource cs = new CancellationTokenSource();
MetroDialogSettings settings = new MetroDialogSettings();
settings.CancellationToken = cs.Token;
var result = this.ShowMessageAsync("Prompt", "Prompt", MessageDialogStyle.Affirmative, settings);
Task.Delay(500).ContinueWith(_ => this.Dispatcher.Invoke(new Action(() => cs.Cancel())));