gpt4 book ai didi

.net - .NET Thread.Abort再次

转载 作者:行者123 更新时间:2023-12-03 13:18:08 25 4
gpt4 key购买 nike

我再次想谈一谈Thread.Abort函数的安全性。我很想有一种方法来中止我实际上无法控制和实际上不想要的操作,但是我想尽快释放线程以防止应用程序的线程渴求。

因此,我编写了一些测试代码,以查看是否可以使用Thread.Abort并让中止线程适本地清理资源。这是代码:

int threadRunCount = 0;
int threadAbortCount = 0;
int threadFinallyCount = 0;
int iterations = 0;

while( true )
{
Thread t = new Thread( () =>
{
threadRunCount++;
try
{
Thread.Sleep( Random.Next( 45, 55 ) );
}
catch( ThreadAbortException )
{
threadAbortCount++;
}
finally
{
threadFinallyCount++;
}
} );

t.Start();
Thread.Sleep( 45 );
t.Abort();

iterations++;
}

因此,到目前为止,该代码工作了大约5分钟,并且 threadRunCount始终等于 threadFinally,而 threadAbort的数量则少一些,因为某些线程没有中断就可以终止,或者最终可能被终止。

所以问题是,我会错过什么吗?

最佳答案

通过精心设计的测试,您可以证明一切。

您已经证明的所有事情就是,使用为测试编写的代码,Thread.Abort似乎可以正常工作。

但是,问题在于,一旦您开始使用需要处理的东西,所有的希望就会丧失。

例如,尝试以下代码:

using (Stream stream = new FileStream(@"C:\Test.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.None))
{
Thread.Sleep( Random.Next( 45, 55 ) );
}

现在,运行一段时间,然后告诉我是否仍然有效。

当代码离开您的 sleep 调用,并出现在using块的隐式finally块内,并且即将关闭流,然后中止它时,就会出现问题。
Thread.Abort的问题在于它可以在任何地方发生,即使在不应该引发异常的代码中也是如此。

例如,您真的希望在评估if-expression之后但在 Dispose -call通过之前,以下代码崩溃吗?
if (_ObjectToDispose != null)
{
_ObjectToDispose.Dispose();
_ObjectToDispose = null;
}

如果在调用 .Dispose之后立即发生该怎么办?该字段仍将具有非null值,这可能会导致其他地方出现细微问题。

如果您这样做:
IDisposable objectToDispose = Interlocked.Exchange(ref _ObjectToDispose, null);
if (objectToDispose != null)
objectToDispose.Dispose();

使用此代码,您可以获取值,并将其替换为null,然后在调用Dispose之前,您的 ThreadAbortException就会发生,它将离开对象。

让我简单地说一下:

Thread.Abort should never be used, except in scenarios where you need to terminate the program (or tear down a custom AppDomain with threads running in it). You should never call Thread.Abort and then continue running.



除非您需要在以后的计划中计划错误。在这种情况下,请继续使用 Thread.Abort,因为我几乎可以保证您会遇到问题。

关于.net - .NET Thread.Abort再次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2084992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com