【发布时间】:2017-10-10 20:03:42
【问题描述】:
我在 WPF 中实现了一种脚本语言,它允许用户编写多个并发操作的脚本。这些动作是使用 async/await 实现的,它们都在主线程上运行。
我现在在这个脚本语言中引入了一个步进调试器。目前,脚本引擎有一个窗口,而步进调试器则有一个不同的窗口。
我正在尝试在执行脚本操作之前在引擎窗口中停止进程,同时不阻止调试器窗口上的交互。 MessageBox.Show() 对此非常有用,尤其是因为它会暂停动画,而这些动画本身可能会在完成时开始新的操作。
Thread.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 方法,我可以看到从另一个窗口关闭它可能会很棘手,更不用说在调试器窗口中进行一些控制但仍然需要用户关闭它是一个尴尬的 UI引擎窗口中的框。
【问题讨论】:
-
如果创建不可见窗口(大小为 1x1)并在其上调用 ShowDialog 会怎样?要释放,您只需设置该窗口的结果。
-
有趣的想法 - 我会试一试。
-
我试过 var win = new Window(); win.Owner = 引擎窗口; win.ShowDialog();它似乎阻止了与调试器和引擎窗口的交互。
-
我发现你的问题很有趣。它远远高于我目前的知识水平,但如果它可以帮助可能与 Begin/EndModalMessageLoop 类似这个问题(关于表单,但有时有很多相似之处)entering-form-modal-message-loop-without-actual-form-showing跨度>
标签: c# wpf async-await dispatcher