暂停 window 像 MessageBox.Show()

Pause a window like MessageBox.Show()

我有一种在 WPF 中实现的脚本语言,它允许用户编写多个并发操作的脚本。这些操作是使用 async/await 实现的,并且所有操作都在主线程上 运行。

我现在将步进调试器引入到该脚本语言中。目前,有一个 window 与脚本引擎关联,另一个 window 与步骤调试器关联。

我正在尝试在脚本操作执行之前停止引擎中的进程 window,同时不阻止调试器 window 上的交互。 MessageBox.Show() 非常适合这个,特别是因为它暂停了动画,这些动画本身可能会在完成时开始新的动作。

Thread.Sleep() 当然根本不起作用,因为每个人都在主线程上。

C# 中是否有类似于 MessageBox.Show() 但没有 UI 的暂停机制?我试过调用 Dispatcher.DisableProcessing(),我发誓可以暂停引擎 window,但现在我收到错误:

'Dispatcher processing has been suspended, but messages are still being processed'

我想理想情况下我想做这样的事情:

//Engine Window
private debugger;
void RunAction(ScriptAction action){
 if(action.BreakPoint){
  var pauserObject = PauseProcessesOnThisWindow();
  debugger.break(action, pauseObject);
}
}

//Debugger Window

void Continue_Click(){
 pauseObject.release();
}

如果我必须使用 MessageBox 方法,我可以看到从另一个 window 中关闭它可能很棘手,更不用说在 UI 中进行一些控制是一件很尴尬的事情调试器 window 但仍需要用户关闭引擎 window 的框。

就个人而言,我避免嵌套的消息循环。由于可重入性,它们相当危险。

我建议为您的脚本使用专用线程 window(参见 "Multiple Windows, Multiple Threads" in the WPF Threading Model documentation)。 运行 在单独的线程中单独 window 在 WPF 上比在 WinForms 上更容易。

不过,如果您确实想要一个嵌套的消息循环,您可以使用 PushFrame.

创建一个