你应该避免你正在考虑的架构。让两个独立的进程一起工作很复杂。操作系统在进程之间竖起了一堵大墙,以确保一个行为不端的进程不会破坏另一个进程的稳定性。每个进程都有自己的内存视图,Windows(尤其是 .NET)使进程很难共享内存。
您必须在进程之间建立通信通道才能让它们一起工作。管道或套接字是通常的选择,这里的心智模型是机器通过网络相互通信。这可能很尴尬,您将拥有 Web 应用程序的所有缺点,而没有 WinForms 客户端或控制台模式应用程序的优点。它也非常不可靠,一个进程的故障很难被另一个应用程序诊断、报告和恢复。我相信您已经看到使用 Internet 浏览器可能出现的问题。
你可以从一个应用程序中得到你想要的。System.Threading.Thread 类为您提供控制台模式应用程序的道德等价物。使用 BackgroundWorker 类或 Control.Begin/Invoke() 方法让 UI 显示来自大脑线程的消息相当简单。顺便说一句,只是“相当”,让线程互操作正确仍然是一项努力。
有两种方法可以实现股票代码更新。推与拉的方法。推送方法是让后台线程主动通知 UI 线程有更新可用。BackgroundWorker.ReportProgress 或 Control.Begin/Invoke 来做到这一点。在 200 毫秒更新时,这不是问题。
在这样的速率下,拉动模型也可以正常工作。您将在 UI 中使用 Timer 来获取定期运行的方法。它可以从计时器的 Tick 方法中的共享属性中读取值。您需要在后台线程和 Tick 方法中使用 lock 语句,以确保值不会在 UI 线程正在读取值时更改。
当值可以非常迅速地变化时,您应该支持拉模型,当更新 UI 所需的时间长于后台线程更新之间的时间间隔时,推的速率会使 UI 线程屈服。UI 线程将落后,无法履行其正常职责。冻结的 UI 是诊断,OOM 是最终结果。除非您对 UI 更新非常花哨或草率,否则 200 毫秒应该不是问题,推送应该可以工作。
I'll have to join the league of friends you consulted about telnet servers. Not sure what problem they solve, they are the 1990 equivalent of a web server when everybody was using a green screen terminal to talk to a computer. It perhaps applies to the need of connecting a separate console mode app to a UI app. You wouldn't use telnet to do that, a socket is a generic channel. .NET Remoting or, better, WCF is the layer that sits on top of that channel to avoid having to deal with the complications of squeezing data or method parameters through a pipe of bytes. Pursue that if you are completely boxed into a multi-process solution already. You shouldn't be for a stock ticker app, nobody cares which way they tick if there isn't anybody there to look at them. Falling tree in the forest, perhaps.