至于标题我遇到了一个问题,即在调用.ContinueWith操作之前将一些结果返回给调用者,以防任务被取消(否则一切都很好)
您可以找到有问题的代码:
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
WaitWindow waitWindow = new WaitWindow(ServerName, DeviceName, cts);
waitWindow.Loaded += (sender, args) =>
{
Task.Factory.StartNew<bool>(() =>
{
while(true) {
//Do some work that returns true or false
//and set waitWindow.ErrorMessage with a specific string
}
}, token).ContinueWith((antecedent) =>
{
Application.Current.Dispatcher.Invoke(() =>
{
if (antecedent.IsCanceled)
{
waitWindow.ErrorMessage = "Search aborted";
waitWindow.DialogResult = false;
}
else
{
waitWindow.DialogResult = antecedent.Result;
}
waitWindow.Close();
});
});
};
waitWindow.ShowDialog();
DeserializeResult dr = new DeserializeResult((bool)waitWindow.DialogResult, waitWindow.ErrorMessage);
return dr;
这个想法是在程序尝试连接到服务器/设备时显示一个带有不确定进度条和取消按钮的窗口。 可能的结果是找到服务器/设备,在预定义的时间量e之后超时并且用户取消搜索。 前两个案例运作良好,而最后一个案例没有,正如我所写,它在继续执行ContinueWith中的代码之前进入“return dr”行。
我已经尝试过各种各样的设置组合,既可以完成任务,也可以继续进行,但没有运气......
我做错了什么?有任何想法吗? 如果您需要更多信息,我将非常乐意给予他们。
更新 我注意到第一次调用(和取消)任务时它没有进入ContinueWith,而第二次进入“return dr”后两次(两个时间都是antecedent.IsCanceled为false)。 ..我绝对不明白为什么......
更新2 也许它并不重要,但我修改了我的伪代码,以澄清该任务包含一个无限循环,意味着以上述三种情况之一结束