我写了一个非静态类。
在这个类中,有一个调用同一个类的静态方法的非静态方法。在这个静态方法中,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 因为指向数组的不安全指针“不能被取消引用......指针不再有效”(??)当我只是更改属性值,但除此之外什么都不做...... 。 这是为什么?