jch*_*tof 2 c# wpf dispatcher async-await
我在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();
}
Run Code Online (Sandbox Code Playgroud)
如果必须使用MessageBox方法,则可以看到从另一个窗口关闭它很棘手,更不用说在调试器窗口中具有某些控件是一个笨拙的UI,但是仍然需要用户从引擎窗口。
就个人而言,我避免嵌套消息循环。由于重入,它们非常危险。
我建议为您的脚本窗口使用专用线程(请参阅WPF线程模型文档中的“多个窗口,多个线程”)。与WinForms相比,在WPF上在单独的线程中运行单独的窗口要容易得多。
不过,如果您确实希望使用嵌套消息循环,则可以使用来创建一个PushFrame。
| 归档时间: |
|
| 查看次数: |
312 次 |
| 最近记录: |