Tag: 中止

如何跨AppDomain边界传递CancellationToken?

我有一个命令对象,根据请求队列的请求进行工作。 此特定命令将在子appdomain中执行其工作。 在子appdomain中完成其工作的一部分涉及阻止ConcurrentQueue操作(例如,Add或Take)。 我需要能够通过请求队列传播中止信号,传递到子appdomain,并唤醒其中的工作线程。 因此,我认为我需要在AppDomain边界传递CancellationToken。 我尝试创建一个inheritance自MarshalByRefObject的类: protected class InterAppDomainAbort : MarshalByRefObject, IAbortControl { public InterAppDomainAbort(CancellationToken t) { Token = t; } [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure)] public override object InitializeLifetimeService() { return null; } public CancellationToken Token { get; private set; } }; 并将此作为参数传递给worker函数: // cts is an instance variable which can be triggered by another […]

ThreadAbortException最终可以跳过吗?

我读过的所有内容声称线程中止将在从ThreadAbortException结束之前执行finally块。 我想确认这一点,以便我可以计划如何处理可以无限期挂起的第三方代码。 但是下面的测试让我困惑: public void runTest(DateTime deadline) { testThread = new Thread(() => { try { Console.WriteLine(“test thread started at ” + DateTime.Now.ToShortTimeString()); while (true) { } } finally { Console.WriteLine(“test thread entered FINALLY at ” + DateTime.Now.ToShortTimeString()); while (true) { } } }); testThread.Start(); while (testThread.IsAlive && deadline.Subtract(DateTime.Now).TotalSeconds > 0) { Console.WriteLine(“main thread while […]

使用控制台应用程序在C#中使用GenerateConsoleCtrlEvent

我正在努力让这个工作变得更加困难,希望你们其中一个人之前做过这件事。 我有一个C#控制台应用程序正在运行一个inheritance其控制台的子进程。 我希望外部应用程序捕获的ctrl-c被传递到内部应用程序,以便它有机会很好地关闭。 我有一些非常简单的代码。 我启动一个进程,然后使用WaitForExit(10)进行轮询。 我还注册了一个CancelKeyPress处理程序,它在触发时将bool设置为true。 轮询循环也检查这个,当它为真时,它调用GenerateConsoleCtrlEvent()(我通过pinvoke映射)。 我已经尝试了很多params组合到GenerateConsoleCtrlEvent()。 第一个参数为0或1,第二个参数为0或子进程的ID。 似乎没什么用。 有时我得到一个假回来,Marshal.GetLastWin32Error()返回0,有时我得到回来。 但没有一个导致子应用程序接收ctrl-c。 为了绝对肯定,我编写了一个测试C#应用程序作为子应用程序,打印出它正在发生的事情,并validation在运行时手动输入ctrl-c正确导致它退出。 几个小时以来,我一直在反对这个问题。 谁能给我一些关于去哪里的指示?

中止对非托管DLL的调用

我有一个非托管DLL,如果输入参数是一个很大的值,它可以运行很长时间,有时这是可取的,但并不总是如此。 我如何在c#中调用此函数以便在需要时可以中止它? 到目前为止,我已经尝试将调用放在一个单独的线程中,但是中断和中止似乎都不会停止进程,该进程在100%CPU运行直到dll完成。 是否可以终止正在运行的DLL代码?