C# 干净地关闭通过另一个应用程序启动的应用程序的最佳方法
我找不到任何接近的答案,因此我正在咨询so用户的体验: 场景: 我有两个小型C#winforms应用程序,其中一个充当服务器或主机,另一个充当客户端。它们通过SQL Server在配置设置方面共享数据 我目前正在通过C# 干净地关闭通过另一个应用程序启动的应用程序的最佳方法,c#,winforms,C#,Winforms,我找不到任何接近的答案,因此我正在咨询so用户的体验: 场景: 我有两个小型C#winforms应用程序,其中一个充当服务器或主机,另一个充当客户端。它们通过SQL Server在配置设置方面共享数据 我目前正在通过Process.Start()从服务器应用程序启动客户端应用程序(只需要定期运行),并通过Process.CloseMainWindow()终止它(在进程列表中找到它之后) 虽然看起来很干净,但我想知道是否有更好的方法 问题: 指示客户端应用程序关闭的最佳方式是: 是否继续使用Pr
Process.Start()
从服务器应用程序启动客户端应用程序(只需要定期运行),并通过Process.CloseMainWindow()
终止它(在进程列表中找到它之后)
虽然看起来很干净,但我想知道是否有更好的方法
问题:
指示客户端应用程序关闭的最佳方式是:
- 是否继续使用Process.CloseMainWindow()
- 在应用程序之间实现WCF?(我需要有关如何执行此操作的帮助。)
- 在SQL中设置客户端应用程序检查的变量
- 还有别的办法吗
- 还有别的办法吗
但是,您可能应该改用WCF。考虑到该进程。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());
鉴于此
与流程资源关联的新组件,如果未启动流程资源(例如,如果重用现有流程),则为null
然后可以使用此值调用CloseMainWindow
:
myProcess.CloseMainWindow();
唯一不返回进程
组件的重载是
(顺便说一句,直到我发布了这个答案后,我才阅读了关于这个问题的评论)我认为这是一个有效的答案,但我还想补充一点,微软建议在远程处理上使用WCF,请参阅和。对于这样一个简单的信息,WCF对我来说似乎非常复杂,可能是太过了;另一方面,.NET远程处理似乎更容易(到目前为止),尽管我不喜欢使用“即将过时”的东西。我意识到WCF是一个更好的选择。我只是介绍另一个选项。也许我应该问一个关于WCF的单独问题:是否可以单独在两个winforms应用程序之间设置?感谢您提供的信息。
Process.CloseMainWindow()
似乎已经足够好了(关闭主窗口将退出大多数应用程序)。但是为什么不记住您启动的流程,例如在类字段或局部变量中,而不是在流程列表中搜索它呢?这将是一种改进!当我启动它时,我只调用Process.start(“app.exe”)但是调用.start()不返回进程ID。如何最好地记住以后终止的进程?只需存储进程返回的进程
。启动或创建一个新的进程
实例,如示例所述:谢谢0xA3-工作正常。我有一些理由将它们作为单独的应用程序,但这是一个有效且有用的想法。
myProcess.CloseMainWindow();