C# 干净地关闭通过另一个应用程序启动的应用程序的最佳方法

C# 干净地关闭通过另一个应用程序启动的应用程序的最佳方法,c#,winforms,C#,Winforms,我找不到任何接近的答案,因此我正在咨询so用户的体验: 场景: 我有两个小型C#winforms应用程序,其中一个充当服务器或主机,另一个充当客户端。它们通过SQL Server在配置设置方面共享数据 我目前正在通过Process.Start()从服务器应用程序启动客户端应用程序(只需要定期运行),并通过Process.CloseMainWindow()终止它(在进程列表中找到它之后) 虽然看起来很干净,但我想知道是否有更好的方法 问题: 指示客户端应用程序关闭的最佳方式是: 是否继续使用Pr

我找不到任何接近的答案,因此我正在咨询so用户的体验:

场景:

我有两个小型C#winforms应用程序,其中一个充当服务器或主机,另一个充当客户端。它们通过SQL Server在配置设置方面共享数据

我目前正在通过
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();