我已经写了一个非静态类。
在这个类中,有一个非静态方法调用同一个类的静态方法。在这个静态方法中,在匿名方法(或lambda表达式...)中启动了2个或更多不同的线程。它们独立地在一个非常大的数组上做一些工作。
这一切都工作得很完美!很棒的表现,没有问题……
But....there也是一个公共静态属性,它受到静态锁定object...that的保护,我不会将其用于锁定此静态属性以外的任何其他用途。
在某种程度上,所有这些看起来就像这样:
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()中同时启动2个或4个或更多的线程作为匿名委托(或λ表达式)...
现在,我真的不能理解的是:
当所有线程都在并行运行时,我是否从另一个线程更改了a属性CancelProcessing的值,尽管此属性未在线程内使用(它本应用于取消线程,但我始终具有相同的错误/异常),我得到了System.AccessViolationException,因为指向数组的不安全指针“不能是dereferenced...The指针无效”(??)当我只更改属性值,而不做其他任何事情时...为什么会这样呢?
发布于 2013-04-13 07:05:00
如果您使用的是.NET 4或更高版本,我建议您使用任务而不是线程来处理计算绑定数组。使用CancellationTokenSource进行取消。关于异常,它可能与您的数组处理有关,而不是与布尔或锁定有关。您必须揭示更多有关数组处理的信息。
https://stackoverflow.com/questions/15981920
复制相似问题