【发布时间】:2023-04-09 21:40:01
【问题描述】:
我正在模态对话框的后台线程中执行一个可能长时间运行的操作。问题是,当操作需要很短的时间时,对话框几乎立即显示和关闭,这让用户很恼火。 我只想在操作时间超过 2 秒时才显示对话框。
对话框是一个 WPF 窗口,长时间运行的操作代码在 ViewModel 中。 ViewModel 创建一个在后台运行操作的任务。
这是一个相关的sn-p:
public Task StartAction() {
var mainTask = Task.Factory.StartNew(InternalAction);
MainTask = mainTask;
mainTask.ContinueWith(_ => { IsFinished = true; });
return mainTask;
}
InternalAction 是可能长时间运行的操作。
这就是我试图引入延迟的方式。我正在使用来自不同 answer 的 Sriram Sakthivel 的建议,但代码并不完全相同:
var viewModel = ... // Creates the ViewModel
var dialogWindow = ... // Creates the Window and starts the operation by calling viewModel.StartAction();
var delayTask = Task.Delay(2000);
if (viewModel.MainTask != null) {
Task.WaitAny(delayTask, viewModel.MainTask);
}
if (viewModel.IsFinished) {
return;
}
ShowDialog(dialogWindow); // this code calls dialogWindow.ShowDialog() eventually
我没有使用await,因为我不想将控制权交给调用者 (COM),因为调用者希望在获得控制权时结果准备就绪。
我一直在尝试不同的超时时间,例如 5000 毫秒,但我没有发现行为有任何差异。对话窗口仍然“闪烁”(显示并立即关闭)。我确定我做错了什么,但我无法理解我的错误。
【问题讨论】: