我写了一个非静态类。
在这个类中,有一个非静态方法调用同一个类的静态方法。 在这个静态方法中,在匿名方法(或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,因为当我只是更改属性值时,不能解除引用指向数组的不安全指针...指针无效'(??)别无所求......为什么会这样?
答案 0 :(得分:1)
如果您使用的是.NET 4及更高版本,我建议您使用Tasks代替线程进行计算绑定数组处理。使用CancellationTokenSource取消。 关于异常,它可能与您的数组处理有关,而不是与bool或锁定。您必须透露有关阵列处理的更多信息。