Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当应用程序从taskmanager'终止时,是否可能在c#应用程序中触发任何事件;什么是过程?_C# - Fatal编程技术网

当应用程序从taskmanager'终止时,是否可能在c#应用程序中触发任何事件;什么是过程?

当应用程序从taskmanager'终止时,是否可能在c#应用程序中触发任何事件;什么是过程?,c#,C#,我有一份c表格申请表。当此表单从任务管理器的流程中关闭时,我必须在表单应用程序中执行某些操作。可能吗 如果我误导了什么,我道歉。但我需要这个解决方案 任务管理器将首先尝试优雅地关闭您的应用程序。您将收到一个正常的关闭信号,您可以对其采取行动。在可能与主窗口的关闭/关闭相对应的窗体应用程序中。如果未使用此信号及时结束应用程序,任务管理器将终止进程。您将无法拦截该进程或对其采取行动。据我所知,使用任务管理器立即终止进程。 应用程序无法以任何方式获得通知 任务管理器通常调用Windows API Ex

我有一份c表格申请表。当此表单从任务管理器的流程中关闭时,我必须在表单应用程序中执行某些操作。可能吗


如果我误导了什么,我道歉。但我需要这个解决方案

任务管理器将首先尝试优雅地关闭您的应用程序。您将收到一个正常的关闭信号,您可以对其采取行动。在可能与主窗口的关闭/关闭相对应的窗体应用程序中。如果未使用此信号及时结束应用程序,任务管理器将终止进程。您将无法拦截该进程或对其采取行动。

据我所知,使用任务管理器立即终止进程。
应用程序无法以任何方式获得通知

任务管理器通常调用Windows API ExitProcess来终止进程

关于如何钩住API,您可以参考:


在另一种情况下,您可以创建一个额外的进程来检查主应用程序,如果他发现应用程序已关闭,则执行一些操作。如果主应用程序正常关闭,则进程将从主应用程序终止。这可能是一个简单的解决办法

不,你不能。为了跟踪这种情况,您可以在启动时在操作系统保证写入许可的目录中创建一些隐藏文件,并在应用程序关闭时删除该文件

这样,若你们的应用程序启动时,你们会发现隐藏的文件,这将意味着应用程序是以非正常方式关闭的。因此,您可以相应地执行一些操作


希望这能有所帮助。

“不,你不能,但你能做的是在处理表单之前做些什么。msdn.microsoft.com/en us/library/…你到底想归档什么?–”

更新

根据您对我的评论的回复:

如果你做了别的事情怎么办。创建一个windows服务(守护进程),用于检查窗体何时打开(windows名称),然后监视窗体以检查其何时关闭,并在关闭时调用所需的web服务

您的windows服务将如此简单:

        Thread thread = new Thread(() =>
        {
            while (!formClosed)
            {
                if (!Process.GetProcesses().Any(x => x.MainWindow.Title.Contains(windowName)))
                {
                    //form closed, call your web service
                }

                Thread.Sleep(5000);
            }
        });

不,你不能,但你能做的是在处理表单之前做点什么。你到底想归档什么?@Marco事实上,当web服务关闭时,我必须调用它。当我从应用程序退出按钮正常关闭它时,它工作正常。但是当我试图从taskmanager的进程关闭它时,它什么也不做。taskmanager将杀死所有线程。您需要另一个流程来监督您的第一个流程。您是否有任何来源支持该声明?我相信如果您结束进程(从process explorer的“进程”选项卡),windows只会终止进程。与Linux不同,它不会向被终止的进程发送信号。更正:如果你“杀死任务”,它会发送信号,如果你“杀死进程”,它不会发送信号。@nvoigt谢谢你提供的信息。但我得想个办法“杀戮过程”谢谢。我将这样做,并让你知道和每个人谁提出了这个解决方案。但是如果你能在我的Win表单中完成这个表单会更好。就像我在Rezoan之前说过的,你不能按照你想要的方式完成它,因为当任务管理器中的表单关闭时,所有线程都会被销毁。如果您有其他问题,请告诉我们。谢谢。这是一个很好的解决办法。如果我运行的是与web服务交互的单表单应用程序,我将接受您的回答。真正的场景是每个表单都使用来自webservice的ClientID。当一个表单关闭时,它需要发送一个webservice请求以释放clientID,以便其他表单稍后可以使用该clientID。@Rezoan:在“正常”情况下,您可以按您所说的去做。我的解决方案适用于异常情况,即进程被终止或崩溃。在这种情况下,您将在下次启动时与web服务通信。也许你也可以考虑在服务器端实现一些定时器,如果你没有收到来自givel客户端的任何请求(比如24小时内),那么自动卸载它。这只是一个想法……这是正确的解决方案,因为它也适用于应用程序错误关闭的其他情况。例如,如果电源线从墙上撕下。即使你以某种方式将一个事件连接到任务管理器杀死你的应用程序(或连接ExitProcess API),你也会错过其他所有可以强制从内存中删除应用程序的方法。如果允许运行多个应用程序实例,你仍然可以通过某个文件、共享互斥锁来管理它,情况如何。每个实例都了解的一些资源。