并行线程分手了

时间:2013-04-12 22:34:42

标签: c# .net multithreading

我写了一个非静态类。

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

这完美无缺!!很棒的表现,没有问题......

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

所有人都看起来像这样:

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()之后,在staticThreadsMethods() ... {/ p>中的匿名委托(或lambda表达式)同时启动2个或4个或更多个线程

现在,我真正无法理解的是:

我是否从另一个线程更改了属性CancelProcessing的值,而所有线程并行运行,虽然这个属性未在线程中使用(它应该用于取消线程,但是我总是有相同的错误/异常),我得到一个System.AccessViolationException,因为当我只是更改属性值时,不能解除引用指向数组的不安全指针...指针无效'(??)别无所求......为什么会这样?

1 个答案:

答案 0 :(得分:1)

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