Tag: 终止

无需中止或挂起即可立即终止无环线程

我正在实现一个协议库。 这是一个简化的描述。 主函数中的主线程将始终检查网络流上是否有某些数据(在tcpclient中)。 让我们说响应是收到的消息,而线程是一个正在运行的线程。 thread = new Thread(new ThreadStart(function)); thread.IsBackground = true; thread.Start(); while(true){ response = receiveMessage(); if (response != null) { thread.Suspend(); //I am searching for an alternative for the line above and not thread.Abort(). thread2 = new Thread(new ThreadStart(function2)); thread2.IsBackground = true; thread2.Start(); } } 到目前为止一切顺利,在while循环中实际上有更多的消息,并且还有一个用于处理不同类型的传入消息的状态机,但这应该足够了。 (还有不仅仅是函数“function”和“function2”)。 所以无论如何这些函数在这个应用程序中看起来都不清楚,因为协议是程序员隐藏的并且意味着它是一个库。 这意味着协议将启动一些程序员定义的函数作为线程,具体取决于程序在协议中的状态。 因此,如果接收到特殊响应(例如callAnotherFunction消息),我想突然终止一个线程(此处命名为“thread”),让我们说在100毫秒内。 但是我不知道它是在一个循环内执行还是没有循环,并且在它终止之前需要多少处理。 如何在不弃用Suspend或Exceptionthrowing Abort函数的情况下停止这些线程? […]

为什么svchost.exe终止我的C#应用​​程序?

出于某种原因,我的C#应用​​程序被svchost.exe终止,我试图理解为什么。 它正在静默终止应用程序,直到我使用Windows调试工具中的Gflags.exe打开Silent Process Exit日志记录。 它不常发生在我无法在(客户PC)上运行调试工具的机器上。 该活动并没有真正为我提供太多信息。 终止代码是805306369 = 0x30000001,但我似乎无法在网上找到任何有用的信息,告诉我如何解释这个数字。 我希望Silent Process Exit日志会对此有所了解,但现在我还有更多问题。 任何意见,将不胜感激。 感谢您的帮助! 这是有问题的事件: Log Name: Application Source: Microsoft-Windows-ProcessExitMonitor Date: 06/05/2013 04:12:17 PM Event ID: 3001 Task Category: None Level: Information Keywords: Classic User: SYSTEM Computer: PC Description: The process ‘C:\Users\Administrator\AppData\Local\MyApp.exe’ was terminated by the process ‘C:\Windows\System32\svchost.exe’ with termination code -805306369. The creation time […]

如果程序意外关闭,IDisposable对象是否会被丢弃?

如果程序意外退出(exception或进程终止)会发生什么? 是否存在程序将终止的此类(或其他)情况,但IDisposable对象将无法正确处理? 我问的原因是因为我正在编写与外围设备通信的代码,我想确保它不会被置于糟糕的状态。

即使进程正在运行,Process.HasExited也会返回true?

我一直在观察Process.HasExited有时会返回true即使进程仍在运行。 我的代码在下面启动一个名为“testprogram.exe”的进程,然后等待它退出。 问题是有时我会抛出exception; 似乎即使HasExited返回true的进程本身仍然存在 – 这怎么可能? 我的程序在它终止之前写入日志文件,因此我需要在读取之前确保该日志文件存在(也就是进程已终止/完成)。 不断检查它的存在不是一种选择。 // Create new process object process = new Process(); // Setup event handlers process.EnableRaisingEvents = true; process.OutputDataReceived += OutputDataReceivedEvent; process.ErrorDataReceived += ErrorDataReceivedEvent; process.Exited += ProgramExitedEvent; // Setup start info ProcessStartInfo psi = new ProcessStartInfo { FileName = ExePath, // Must be false to redirect IO UseShellExecute = […]

父进程在C#中终止时如何终止子进程

任务:如果父进程终止,则自动终止所有子进程。 父进程不仅可以以正确的方式终止,还可以通过在ProcessExplorer中进行终止来终止。 我该怎么做? 在С主题建议中使用Job对象的类似问题。 如何在C#中使用它而不导出外部DLL? 我试着使用Job Objects。 但是这段代码不能正常工作: var job = PInvoke.CreateJobObject(null, null); var jobli = new PInvoke.JOBOBJECT_BASIC_LIMIT_INFORMATION(); jobli.LimitFlags = PInvoke.LimitFlags.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | PInvoke.LimitFlags.JOB_OBJECT_LIMIT_PRIORITY_CLASS | PInvoke.LimitFlags.JOB_OBJECT_LIMIT_JOB_TIME | PInvoke.LimitFlags.JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION | PInvoke.LimitFlags.JOB_OBJECT_LIMIT_JOB_MEMORY; var res = PInvoke.SetInformationJobObject(job, PInvoke.JOBOBJECTINFOCLASS.JobObjectBasicLimitInformation, jobli, 48); if (!res) { int b = PInvoke.GetLastError(); Console.WriteLine(“Error ” + b); } var Prc = Process.Start(…); PInvoke.AssignProcessToJobObject(job, Prc.Handle); PInvoke.SetInformationJobObject返回错误。 […]

在“杀死”c#之前检查线程是否完成了它的方法

我的程序中有2个线程。 1是处理GUI而另一个是进行一些文字自动化。 让我们称他们为GUIThread和WorkerThread。 WorkerThread使用递归循环遍历方法。 在执行自动化一词时,WorkerThread只能处于活动状态,用户必须能够停止自动化一词。 因此,我在GUI上实现了一个“停止”按钮,它只是杀死/终止WorkerThread。 但是,如果我在方法中间杀死WorkerThread,它有时会导致我的word文档出现问题(这是一个较长的故事),这就是为什么我要在检查之前检查WorkerThread是否已从方法完成/返回它。 当我点击“停止”按钮时,这就是我的代码所做的事情: //Stops the worker thread = stops word automation in process workerThread.Abort(); //This blocks the thread until the workerThread has aborted while (workerThread.IsAlive) ; 我自己对这个问题的建议/解决方法是有一个全局变量,我可以在每次输入WorkerThread时设置并留下一个方法,但这对我来说似乎不对。 我的意思是我认为必须有一种更简单的方法来处理它。