使WPF应用程序多进程

时间:2010-10-12 11:22:44

标签: c# wpf multithreading multiprocessing

我目前有一个多线程应用程序,它按以下顺序运行:

  1. 启动并更改XML文件
  2. 做好工作
  3. 将XML更改为默认值
  4. 第3步非常重要,我必须确保它始终发生。但是如果应用程序崩溃,我可能会得到错误的XML。

    我使用它的场景是:

    我的应用程序是一个小型实用程序,它连接到远程设备,但在同一台机器上有一个正在运行的服务,它连接到我要连接的同一个远程设备。服务公开restartService方法,并在启动期间根据它将连接到远程设备的XML数据或不会。所以最后我必须确保无论我的应用程序发生了什么,XML都被设置为默认状态。

    我认为让一个线程作为一个单独的进程运行,并且每隔n秒检查主进程是否处于活动状态并且响应将解决此问题。但我发现在C#中很少有多进程应用程序的例子。因此,如果有人可以展示如何创建一个作为单独进程运行的线程的示例,那就太棒了。

    如果我创建一个单独的项目 - 控制台应用程序怎么办?它被编译成单独的可执行文件,并从主应用程序中启动。然后使用IpcChannel进行2个进程之间的通信。或者创建WCF应用程序。其中一种方法是否有效?

5 个答案:

答案 0 :(得分:2)

Thread属于Process,所以如果进程死了,那么它的所有线程也是如此。每个应用程序都应该是一个单独的过程,虽然您可以启动其他过程,但这听起来像是一个简单问题的复杂解决方案。

您可以将内容读入内存并保留文件系统,而不是更改和还原文件吗?

答案 1 :(得分:1)

您可以订阅名为DispatcherUnhandledException的事件,以便在抛出未处理的异常时,您可以安全地还原XML设置。

 public partial class App : Application
{
    public App()
    {
        this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
    }

    void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        //When ever an Unhandeled exception is thrown

        // You can change your XML files to default values.
    }

}

//如果你通过任务管理器杀死进程

AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);

void CurrentDomain_ProcessExit(object sender, EventArgs e)
    {
        // Change your Settings Here.
    }

//如果您启动了Windows ShutDown

this.SessionEnding += new SessionEndingCancelEventHandler(App_SessionEnding);

  void App_SessionEnding(object sender, SessionEndingCancelEventArgs e)
    {
        // XML Changes
    }

答案 2 :(得分:0)

您所谈论的内容通常在大型机计算和其他大型计算基础架构中称为“监督”。监督过程是在监督过程的监督下运行的过程,如果前者崩溃或无法完成其工作,该过程将重新启动或以其他方式“修复”问题。

如果Windows停止工作,Windows会自动重启服务,您可以看到这一点。这是监督子系统的一个非常简单的版本。

据我所知,这是一个复杂的计算机工程领域,我不认为Windows或.NET为它提供了编程接口。根据您的具体需求,您可以开发一种简单的方法。

答案 3 :(得分:0)

考虑在配置文件中设置“脏”标志,并将默认XML的备份存储在另一个文件中。当您的应用程序启动时,它会更改XML并设置标志。如果成功完成,则重置标志并恢复XML。您的服务会检查该标志,以查看是否需要使用应用程序编写的最后一个XML或切换到备份文件。

答案 4 :(得分:0)

我认为应用程序是多线程还是多进程或其他任何实际上不需要解决的问题。真正的问题是:如何使这个操作成为原子?

当你说你必须确保第3步总是发生时,你真正要说的是你的程序需要执行原子事务:要么全部发生,要么都不会发生。

要实现此目的,您的流程应按照数据库事务的设计方式进行设计。它应该开始事务,完成工作,然后提交事务或回滚事务。应该设计该进程,以便在启动时检测到事务已开始但未提交或由早期运行回滚,它应该从回滚该事务开始。

至关重要的是,提交方法应该具有尽可能少的不稳定性。例如,设计事务进程的典型方法是使用文件系统:创建一个临时文件来指示事务已经开始,将输出写入临时文件,然后让commit方法将临时文件重命名为最终文件命名并删除transaction-flag文件。在您重命名文件的时间和删除标记文件的时间之间,文件系统仍然存在风险(并且还有一些方法可以降低风险),但风险要小得多。你一直在描述的那种。

如果您设计流程以便它实现事务模型,那么它是使用多处理还是多线程还是单线程只是一个实现细节。