相关疑难解决方法(0)

Thread.Abort vs Thread.Interrupt

如果我需要取消一个线程一些操作,我什么时候应该使用Thread.AbortVS Thread.Interrupt.我阅读了有关它的文档,但不确定哪个scneario我应该使用两个之间的特定调用.

如果有任何第三种方式,请让我知道它与赞成和利弊.

c# multithreading

22
推荐指数
2
解决办法
2万
查看次数

是否可以解释PrepareConstrainedRegions和Thread.Abort的这种意外行为?

今晚我与约束执行区一起玩耍,以更好地完善我对更好细节的理解。我以前曾经使用过它们,但是在那种情况下,我主要严格遵守既定模式。无论如何,我注意到了一些我无法完全解释的奇特之处。

考虑下面的代码。注意,我的目标是.NET 4.5,并在没有附加调试器的情况下使用Release版本对其进行了测试。

public class Program
{
    public static void Main(string[] args)
    {
        bool toggle = false;
        bool didfinally = false;
        var thread = new Thread(
            () =>
            {
                Console.WriteLine("running");
                RuntimeHelpers.PrepareConstrainedRegions();
                try
                {
                    while (true) 
                    {
                      toggle = !toggle;
                    }
                }
                finally
                {
                    didfinally = true;
                }
            });
        thread.Start();
        Console.WriteLine("sleeping");
        Thread.Sleep(1000);
        Console.WriteLine("aborting");
        thread.Abort();
        Console.WriteLine("aborted");
        thread.Join();
        Console.WriteLine("joined");
        Console.WriteLine("didfinally=" + didfinally);
        Console.Read();
    }
}
Run Code Online (Sandbox Code Playgroud)

您认为该程序的输出是什么?

  1. didfinally =真
  2. didfinally =假

在猜测之前,请阅读文档。我在下面包括相关部分。

约束执行区(CER)是创作可靠的托管代码的机制的一部分。CER定义了一个区域,在该区域中,公共语言运行库(CLR)受到约束,无法抛出带外异常,这将阻止该区域中的代码整体执行。在该区域内,用户代码无法执行代码,从而导致抛出带外异常。PrepareConstrainedRegions方法必须立即在try块之前,并将catch块,fault块和Fault块标记为受约束的执行区域。一旦标记为受约束区域,代码就只能调用具有强可靠性合同的其他代码,并且除非代码准备好处理失败,否则代码不应分配或对未准备好的方法或不可靠的方法进行虚拟调用。对于在CER中执行的代码,CLR延迟线程中止。

可靠性try / catch / finally是一种异常处理机制,具有与非托管版本相同的可预测性保证。 …

.net c# multithreading cer threadabortexception

5
推荐指数
1
解决办法
736
查看次数

标签 统计

c# ×2

multithreading ×2

.net ×1

cer ×1

threadabortexception ×1