如何在csi.exe中实现VS C# Interactive式的WPF窗口持久显示?
在csi.exe中持久显示WPF窗口的解决方案
我懂你的困扰——在Visual Studio的C# Interactive里,简单一行w.Show()就能让窗口稳稳待着,但用csi.exe运行时,窗口总是秒消失对吧?这背后的核心差异是消息循环:
VS的C# Interactive本身就运行在STA线程上,后台还一直维持着一个消息循环处理UI事件;但csi.exe默认是MTA线程,你手动创建的STA线程如果只靠Thread.Sleep()撑着,睡眠一结束线程就终止,窗口自然就跟着没了。
要实现和VS里一样的持久效果,关键是让你的STA线程持续运行WPF的消息循环,而不是靠Sleep硬撑。这里有两种靠谱的实现方法:
方法一:启动Dispatcher消息循环
直接在STA线程里启动WPF的调度器循环,它会一直运行直到你手动关闭窗口:
#r "PresentationFramework" using System.Windows; using System.Threading; var t = new Thread(() => { var w = new Window { Title = "持久化WPF窗口" }; w.Show(); // 启动消息循环,持续处理UI事件直到窗口关闭 System.Windows.Threading.Dispatcher.Run(); }); t.SetApartmentState(ApartmentState.STA); t.Start();
这段代码里,Dispatcher.Run()会接管线程,持续处理窗口的渲染、用户输入等消息,直到你关闭窗口线程才会结束,完全不会卡住csi.exe。
方法二:用ShowDialog()简化代码
如果不需要同时做其他线程操作,ShowDialog()是更简洁的选择——它会自动启动消息循环,直到窗口关闭才返回:
#r "PresentationFramework" using System.Windows; using System.Threading; var t = new Thread(() => { var w = new Window { Title = "ShowDialog窗口" }; // ShowDialog自带消息循环,窗口关闭前不会退出线程 w.ShowDialog(); }); t.SetApartmentState(ApartmentState.STA); t.Start();
这个方法和方法一效果完全一致,代码更短,适合快速测试场景。
补个小知识点:为什么VS里的代码能直接跑?
VS的C# Interactive启动时就把自身线程设为STA了,而且后台一直运行着Dispatcher循环,你调用w.Show()后,窗口能直接挂靠到这个现成的消息循环上,自然就能一直显示啦。
内容的提问来源于stack exchange,提问作者Paweł Audionysos
相关产品推荐
相关产品推荐

