0

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())));
4

0 に答える 0