首先,this SO post无法回答此问题,因为它描述了简单/基本对象引用问题。我遇到的问题与多线程异步处理有关,另一篇文章则没有解决。
我有一个多线程.NET winforms应用程序,我正在这样做:
if ( paramList != null ) {
lock ( paramList ) {
foreach ( DictionaryEntry param in paramList ) {
command.Parameters.AddWithValue(param.Key.ToString(),param.Value);
}
}
}
paramList
是OrderedDictionary
。
我偶尔在foreach
行中收到此错误:
对象引用未设置为对象的实例。
如您所见,param.Key
为空,param.Value
为空。但这没有任何意义,因为paramList
中没有空值,如您所见:
在屏幕快照中,您只能看到索引2,但是我也检查了索引0和1,同样的东西,有效数据,没有null。
我对多线程应用程序没有经验,但是由于this SO post中的响应,我将该块放在lock()
中。在放入lock()
之前,我偶尔会收到错误Collection was modified; enumeration operation may not execute.
。在放入锁之后,该错误消失了,但是现在我得到了上面所示的对象引用。
该怎么办?
编辑
根据一些海报的建议,我这样做了:
private static object syncLock = new object();
然后降低用法:
lock ( syncLock ) {
if ( paramList != null ) {
foreach ( DictionaryEntry param in paramList ) {
command.Parameters.AddWithValue(param.Key.ToString(),param.Value);
}
}
}
这似乎已经解决了对象引用错误(感谢大家),但是现在我偶尔会得到:
集合已修改;枚举操作可能无法执行。
因为尝试这种新方法后出现了完全不同的错误,所以我created a new SO question。我不确定这样做是否正确,因为现在看来这些问题是相关的,而我只是看到同一核心问题的不同症状。
如果有人有想法,仍在寻找解决方案。