C# 暂停MessageBox.Show()之类的窗口

C# 暂停MessageBox.Show()之类的窗口,c#,wpf,async-await,dispatcher,C#,Wpf,Async Await,Dispatcher,我在WPF中实现了一种脚本语言,允许用户编写多个并发操作的脚本。这些操作是使用async/await实现的,所有这些操作都在主线程上运行 我现在在这个脚本语言中引入一个step调试器。目前,有一个窗口与脚本引擎关联,另一个窗口用于step调试器 我试图在执行脚本操作之前在引擎窗口中停止进程,同时不阻止调试器窗口上的交互MessageBox.Show()非常适用于此,特别是因为它会暂停动画,而动画本身可能会在完成时启动新动作 当然,Sleep()根本不起作用,因为每个人都在主线程上 C#中是否有类

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

我现在在这个脚本语言中引入一个step调试器。目前,有一个窗口与脚本引擎关联,另一个窗口用于step调试器

我试图在执行脚本操作之前在引擎窗口中停止进程,同时不阻止调试器窗口上的交互MessageBox.Show()非常适用于此,特别是因为它会暂停动画,而动画本身可能会在完成时启动新动作

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

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

'调度程序处理已挂起,但仍在处理消息'

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

//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方法,我可以看到从另一个窗口关闭MessageBox可能会很棘手,更不用说在调试器窗口中有一些控件但仍然要求用户从引擎窗口关闭MessageBox是一个笨拙的UI

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

我建议为脚本窗口使用专用线程(请参阅)。在单独的线程中运行单独的窗口在WPF上比在WinForms上更容易


但是,如果确实需要嵌套的消息循环,则可以使用创建不可见窗口(大小为1x1)并调用ShowDialog来创建一个。

如果创建不可见窗口会怎么样?要发布,您只需设置该窗口的结果即可。有趣的想法-我将尝试一下。我尝试了var win=new window();win.Owner=EngineWindow;win.ShowDialog();它似乎阻止了与调试器窗口和引擎窗口的交互。@jchristof,请看一看,但请注意,它仍然运行一个嵌套的消息循环,这会打开一整罐蠕虫(如所述的重入问题)。至少应该禁用UI(
ShowDialog
为此使用
EnableWindow
API)。我发现您的问题很有趣。这远远超出了我目前的知识水平,但如果它有帮助的话,可能与Begin/EndModalMessageLoop有关,比如这个问题(关于表单,但有时有很多相似之处)我认为这可能就是问题所在,尤其是因为我已经有了一个脚本编辑器和控制台窗口,它也与引擎窗口分开运行,但在主线程上。当引擎运行大量动画时,脚本编辑可能会很烦人。我会仔细看看这一页。谢谢非常好的参考资料-谢谢。我决定让每个进程等待一个“调试”任务,直到Timeout.Infinite,以此作为停止进程的原型。调试器窗口最终可以取消该任务并允许所有任务继续。精度与调用wait()不同,但它可能足以满足我的需要,并且不需要生成新的UI线程。