我找不到任何接近的答案,所以我正在咨询SO用户的经验:
情境:
我有两个小的C#winforms应用程序,其中一个用作服务器或主机,另一个用作客户端。它们在配置设置方面通过SQL Server共享数据。
我目前正在通过Process.Start()
从服务器应用程序启动客户端应用程序(只需要定期运行),并通过Process.CloseMainWindow()
终止它(在进程列表中找到它之后)。
虽然它看起来很干净,但我想知道是否有更好的方法。
问题:
哪种方式最好指示客户端应用程序关闭:
答案 0 :(得分:1)
答案 1 :(得分:1)
鉴于Process.CloseMainWindow()工作表明两个程序都在同一台机器上运行。鉴于真正的服务无法启动桌面上可见的程序,表明您的服务器程序作为常规用户应用程序运行。
现在使用单独的程序已经没有任何意义了。只需让服务器创建一个可见窗口即可。交互是微不足道的,因为一切都在一个程序中运行,并且可以访问该程序的所有状态。
如果服务器处理妨碍客户端窗口保持活动状态,则在线程上显示该窗口。这个助手类完成了工作:
using System;
using System.Threading;
using System.Windows.Forms;
static class ClientView {
private static Form mView;
public static void Start(Form view) {
if (Busy) throw new InvalidOperationException("View already running");
mView = view;
mView.FormClosed += (o, e) => { mView = null; }
Thread t = new Thread(() => Application.Run(view));
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
public static void Stop() {
if (Busy) mView.Invoke(new MethodInvoker(() => mView.Close()));
}
public static bool Busy { get { return mView != null; } }
}
样本用法:
ClientView.Start(new ClientForm());
答案 2 :(得分:1)
与流程资源关联的新Process组件,如果未启动任何流程资源,则为null(例如,如果重用现有流程)。
Process myProcess = Process.Start("client.exe");
然后,您可以使用此值来调用CloseMainWindow
:
myProcess.CloseMainWindow();
唯一不返回Process
组件的重载是parameterless method。
(顺便说一下,在我发布这个答案之前,我没有看过这个问题的评论)