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

时间:2010-05-13 21:55:12

标签: c# winforms

我找不到任何接近的答案,所以我正在咨询SO用户的经验:

情境:

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

我目前正在通过Process.Start()从服务器应用程序启动客户端应用程序(只需要定期运行),并通过Process.CloseMainWindow()终止它(在进程列表中找到它之后)。

虽然它看起来很干净,但我想知道是否有更好的方法。

问题:

哪种方式最好指示客户端应用程序关闭:

  • 继续使用Process.CloseMainWindow()?
  • 在应用程序之间实现WCF? (我需要帮助来解决这个问题。)
  • 在SQL中设置客户端应用程序检查的变量?
  • 其他一些方式?

3 个答案:

答案 0 :(得分:1)

  
      
  • 其他一些方式?
  •   

您可以使用.Net Remoting

但是,您应该使用WCF。

答案 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.Start(string)

  

与流程资源关联的新Process组件,如果未启动任何流程资源,则为null(例如,如果重用现有流程)。

Process myProcess = Process.Start("client.exe");

然后,您可以使用此值来调用CloseMainWindow

myProcess.CloseMainWindow();

唯一不返回Process组件的重载是parameterless method

(顺便说一下,在我发布这个答案之前,我没有看过这个问题的评论)

相关问题