很奇怪的使用DataRow出现索引超出范围的异常

kcxnvcs 2011-07-04 10:31:54


DataRow dr = (DataRow)obj;
int i=0;
//....

try
{
dr["returnCount"] = i;
}
catch(Exception ex)
{
LogWriter.Error(ex.Message);
}
//...


上述代码段是在线程中执行的。中间try部分,为什么偶尔会出现提示:索引超出范围,参数名index????
前面已经做过null判断,而这个dr在线程后续流程中都会用到,没有异常,就这里会提示异常,实在不明白。

...全文
241 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kcxnvcs 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xuexiaodong2009 的回复:]
引用 2 楼 kcxnvcs 的回复:

这个i值只在函数内部使用,并未涉及到多线程使用。而try中的代码只是将一个值付给dr的一列,没有使用arr[i]的情况。实际就是赋值那一步出错,我是以列名访问的,按说是不应该出现索引超出范围这个问题的
没有动态添加删除添加DataRow ,datatable??
[/Quote]

有任务来委托主进程添加一行,任务执行完成,委托主进程删除一行,一个线程在任务执行过程中只访问当前行dr,不会跨线程访问dr,线程执行完就任务完成,
wang_jian_999 2011-07-04
  • 打赏
  • 举报
回复
搞这钟线程,记住要同步,否则其他线程就可能改写你的某些变量,导致你访问时就不是你想要的值了,比如第一个线程设置 i=1,有一个数组是3个元素,有如下代码

i = 1;
此时,因为没有同步,第二个线程对i进行了该写 i = 4;这时,再执行下面的arr[i]时,就越界了
arr[i];
xuexiaodong2009 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kcxnvcs 的回复:]

这个i值只在函数内部使用,并未涉及到多线程使用。而try中的代码只是将一个值付给dr的一列,没有使用arr[i]的情况。实际就是赋值那一步出错,我是以列名访问的,按说是不应该出现索引超出范围这个问题的
[/Quote]没有动态添加删除添加DataRow ,datatable??
kcxnvcs 2011-07-04
  • 打赏
  • 举报
回复
这个i值只在函数内部使用,并未涉及到多线程使用。而try中的代码只是将一个值付给dr的一列,没有使用arr[i]的情况。实际就是赋值那一步出错,我是以列名访问的,按说是不应该出现索引超出范围这个问题的
bdmh 2011-07-04
  • 打赏
  • 举报
回复
搞这钟线程,记住要同步,否则其他线程就可能改写你的某些变量,导致你访问时就不是你想要的值了,比如第一个线程设置 i=1,有一个数组是3个元素,有如下代码

i = 1;
此时,因为没有同步,第二个线程对i进行了该写 i = 4;这时,再执行下面的arr[i]时,就越界了
arr[i];
窗户纸 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kcxnvcs 的回复:]
引用 3 楼 xuexiaodong2009 的回复:
引用 2 楼 kcxnvcs 的回复:

这个i值只在函数内部使用,并未涉及到多线程使用。而try中的代码只是将一个值付给dr的一列,没有使用arr[i]的情况。实际就是赋值那一步出错,我是以列名访问的,按说是不应该出现索引超出范围这个问题的
没有动态添加删除添加DataRow ,datatable??


有任务来委托主进程添……
[/Quote]
貌似问题出在委托上,可能因为激发委托的主线程同时激发了2个以上的委托,且都在对不同的(可能是相同的datarow操作),就会造成这类问题,可以有多种方式解决:
1)限制委托的激发,每次处理完在激发新委托。
2) 委托回调函数内处理时引入线程同步/锁定机制,确保只有一个线程在处理datatable.

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧