Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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
C# 可以立即杀死的任务等价物_C#_Multithreading_Task Parallel Library - Fatal编程技术网

C# 可以立即杀死的任务等价物

C# 可以立即杀死的任务等价物,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,我想在后台运行一个长期运行的Opartion。 这些要求是: 该操作应与调用线程异步运行 调用线程可以等待操作完成并获得其结果 超时后,应立即中止操作 我会使用task,但我所知道的并没有一种机制可以让task死机。 Cancel token不适合我,我只会在任务因未知原因卡住时杀死它——一个bug,这是一个故障安全机制。 如果任务被卡住,那么请求取消是没有用的。 后台工作人员也是如此 除了在调用线程和后台线程之间使用共享对象之外,还有什么比使用共享对象更简单的方法吗?据我所知,杀死线程“死机”

我想在后台运行一个长期运行的Opartion。 这些要求是:

该操作应与调用线程异步运行

调用线程可以等待操作完成并获得其结果

超时后,应立即中止操作

我会使用task,但我所知道的并没有一种机制可以让task死机。 Cancel token不适合我,我只会在任务因未知原因卡住时杀死它——一个bug,这是一个故障安全机制。 如果任务被卡住,那么请求取消是没有用的。 后台工作人员也是如此


除了在调用线程和后台线程之间使用共享对象之外,还有什么比使用共享对象更简单的方法吗?

据我所知,杀死线程“死机”的唯一方法是线程。但是,对于这个相关的问题,您会看到很多答案,这表明使用它通常是不好的做法,除非在极少数情况下


另一种选择是避免试图死机终止任务,并在任务中实现更好的错误处理,以便它能够优雅地处理异常和“卡住”的情况。

据我所知,终止线程“死机”的唯一方法是线程。但是,中止,您将看到许多有关此问题的答案,表明除少数情况外,使用它通常是不好的做法


另一种选择是避免试图彻底终止任务,并在任务中实现更好的错误处理,以便它能够优雅地处理异常和“卡住”的情况。

没有什么比使用共享对象更优雅的了,因为使用共享对象是一种优雅的方式:

您无法提供安全终止任务的通用方法:因为killer线程在尝试终止任务时不知道killee在做什么,这可能会使您的对象模型处于损坏状态

创建Thread.Abort是为了以最干净的方式完成这一任务:抛出一个允许finally语句处理已用资源的异常,或者在被终止的线程上运行事务处理。但此方法会使代码在意外位置引发异常。这是强烈不推荐的

注意:Thread.Abort在任何情况下都不起作用示例:如果您的线程通过p/Invoke运行本机代码,则不会起作用

因此,优雅的解决方案是编写干净的代码,它可以通过取消令牌决定何时终止

nb2:最终的线程。中止在任何情况下都会起作用,并且会保持隔离:创建一个新的AppDomain,通过远程处理在此AppDomain中运行可终止代码,并在想要停止所有操作时调用AppDomain.Unload


不过,这是一个非常极端的解决方案。

没有什么比使用共享对象更优雅的了,因为使用共享对象是实现这一点的优雅方式:

您无法提供安全终止任务的通用方法:因为killer线程在尝试终止任务时不知道killee在做什么,这可能会使您的对象模型处于损坏状态

创建Thread.Abort是为了以最干净的方式完成这一任务:抛出一个允许finally语句处理已用资源的异常,或者在被终止的线程上运行事务处理。但此方法会使代码在意外位置引发异常。这是强烈不推荐的

注意:Thread.Abort在任何情况下都不起作用示例:如果您的线程通过p/Invoke运行本机代码,则不会起作用

因此,优雅的解决方案是编写干净的代码,它可以通过取消令牌决定何时终止

nb2:最终的线程。中止在任何情况下都会起作用,并且会保持隔离:创建一个新的AppDomain,通过远程处理在此AppDomain中运行可终止代码,并在想要停止所有操作时调用AppDomain.Unload

不过,这是一个非常极端的解决方案。

听起来您可能需要Thread.Abort或类似的东西。当您的线程执行非托管codeThreadAbortException时,这两种方法都不可靠。默认情况下,如果捕获,AbortException也会出现问题,即它会被重新捕获,因此,它需要额外的工作来允许线程被重新用于其他任务。听起来您可能需要thread.Abort或类似的东西。当您的线程正在执行非托管codeThreadAbortException时,这两种方法都不可靠。默认情况下,如果捕获到它,它会被重新调用,因此,它需要额外的工作来允许线程被重用用于其他任务。