【发布时间】:2009-12-08 07:07:15
【问题描述】:
我在多线程应用程序中有一个奇怪的错误:
public class MyClass
{
private readonly Hashtable HashPrefs;
public MyClass(int id)
{
HashPrefs = new Hashtable();
}
public void SomeMethodCalledFromAnotherThread(string hashKey,string hashValue)
{
if (HashPrefs.Contains(hashKey)) // <-- throws NullReferenceException
{
}
}
}
一个线程做:
SomeQueue.Add(new MyClass(1));
另一个线程会这样做:
SomeQueue.Dequeue().SomeMethodCalledFromAnotherThread(SomeClass.SomeMethod(),"const value");
但是第二个线程如何在构造函数完成之前调用方法呢?
编辑:我添加了带有函数参数的部分,因为这似乎是相关的。 据我所知,传递的 hashKey 不能为 null,因为 SomeMethod() 总是返回一个相关的字符串。
正如其他人指出的那样,如果问题是传递给 Contains() 的 null haskKey 参数,则异常将是 ArgumentNullException。
【问题讨论】:
-
欢迎来到多线程地狱...
-
哦,我已经从事多线程工作几年了 :-( 。这只是让我头晕目眩的特殊错误之一。
-
您的实例变量可能正在从特定于线程的缓存中读取。请参阅我编辑的答案。
-
无法调试。仅在正常运行数小时后(〜随机)在生产代码中发生。多线程适合你
-
我为此感到害怕。您可以尝试使用 Windows 调试工具来尝试转储问题。运行“adplus -p
-crash”,它会连接一个调试器,当发生未处理的异常时创建转储。
标签: c# multithreading