0

我写了一个非静态类。

在这个类中,有一个调用同一个类的静态方法的非静态方法。在这个静态方法中,2 个或更多不同的线程以匿名方法(或 lambda 表达式......)启动,它们独立地在一个非常大的数组上做一些工作。

这一切都完美!性能很好,没有问题......

但是....还有一个受静态锁定对象保护的公共静态属性...除了锁定此静态属性之外,我不会将其用于任何其他目的。

总而言之,看起来像这样:

public class testClass
{
    private volatile static bool cancelProcessing;
    private static readonly object lockObj = new object();

    public static bool CancelProcessing
    {
        get
        {
            lock (lockObj)
            {return cancelProcessing;}
        }
        set
        {
            lock (lockObj)
            {cancelProcessing = value;}
        }
    }

    public void callingMethod()
    {
        staticThreadsMethods();
    }

    private static void staticThreadsMethods()
    {
         int parts = 4; // array parts
         CountdownEvent _countdown = new CountdownEvent(parts);
         for (int u = 0; u < parts; u++)
            {
                Threads[u] = delegate(object counter)
                {
                    // array gets processed
                    _countdown.Signal();
                };
         }

         _countdown.Wait();
    }
}

在调用之后callingMethod(),2 个或例如 4 个或更多线程与staticThreadsMethods()...内的匿名委托(或 lambda 表达式)同时启动

现在,我真正无法理解的是以下内容:

我是否CancelProcessing从另一个线程更改 a 属性的值,而所有线程都在并行运行,尽管该属性未在线程中使用(它应该用于取消线程,但我总是有相同的错误/异常),我得到一个 System.AccessViolationException 因为指向数组的不安全指针“不能被取消引用......指针不再有效”(??)当我只是更改属性值,但除此之外什么都不做...... 。 这是为什么?

4

1 回答 1

1

如果您使用的是 .NET 4 及更高版本,我建议您使用任务而不是线程来进行计算绑定数组处理。使用 CancellationTokenSource 进行取消。关于异常,它可能与您的数组处理有关,而不是与布尔或锁定有关。您必须透露更多有关数组处理的信息。

于 2013-04-12T23:04:59.577 回答