C# 异步取消异常高速对话

C# 异步取消异常高速对话,c#,task-parallel-library,mahapps.metro,cancellation-token,C#,Task Parallel Library,Mahapps.metro,Cancellation Token,我使用的是使用ShowMessageAsync方法的MahApps Metro对话框。有时我会调用对话框,然后取消它。我这样称呼对话 MetroDialogSettings Settings = new MetroDialogSettings(); Settings.CancellationToken = Token; Token.ThrowIfCancellationRequested(); await this.ShowMessageAsync("Prompt", "Prompt", Mes

我使用的是使用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));
我还使用了令牌。
throwifcancellationrequest()因为显示和取消之间存在异步。我的问题是,如果我在演出前取消,它可以正常工作,如果我在演出后取消,它也可以正常工作,但是如果我在演出后0~500毫秒之间取消它,它会抛出一个NullReference异常。似乎MahApps代码中的某些内容不正确,导致它失败,除非它在完全初始化之前被取消。我试图找到一种方法来锁定它,这样我只能在它初始化后取消它,但我找不到一种方法来判断它是否准备好了

更新:

这被简化为确切的失败原因。以下代码引发NullReference异常

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

请显示
Task.Delay(1000).ContinueWith(=>CancelDialog(cs))周围的代码,这可能是导致空引用异常的错误所在。我们需要看到的重要内容是
cs
,它是如何分配的,并且是
cs=null完成过吗?@ScottChamberlain我添加了一个更详细的布局,说明什么会/不会导致异常异常异常异常的堆栈跟踪是什么?